2013-05-31 8 views
7

Biorąc ścieżkę takiego test/90_2a5/WindowsPierwsze nazwę katalogu nadrzędnego poprzez rurociągi wyniki dirname do basename w skrypcie bash

staram się uzyskać wynik 90_2a5 pomocą poleceń dirname do uzyskać ścieżkę i po basename, aby uzyskać nazwę.

Problem występuje, gdy próbuję zrobić to w pojedynczej linii, próbując potokować wyniki z dirname do basename.

Próbowałem tego, ale wydaje się, że używam go w niewłaściwy sposób.

path="test/90_2a5/Windows" 
finalName= basename var | dirname $path 
echo "$finalName" 

Problemem jest to, że finalName jest pusty ciąg znaków, co oznacza, że ​​wyniki nie są dirname przekierowanie.

Odpowiedz

16

Nie Rura je zrobić, ale raczej przekazać je jako parametry:

finalName=$(basename -- "$(dirname -- "$path")") 

Niektóre polecenia po prostu nie akceptują strumieni wejścia, ale tylko parametry:

$ echo foo/bar | basename 
basename: missing operand 
Try `basename --help' for more information. 
$ basename foo/bar 
bar 
+0

Świetna odpowiedź! Dziękuję bardzo! – stratis

+3

Możesz również wykonać polecenie 'echo foo/bar | xargs basename'. Użycie 'xargs' sprawia, że ​​system przyjmuje strumień. – jeffreyveon

+0

@jeffreyveon Nie, 'xargs' przekształca standardowe wejście na * listę parametrów * dla' basename'. – l0b0

0

Użyj $ {ścieżka # * /}, aby usunąć znaki do pierwszego "/". Następnie użyj dirname, aby usunąć "/ Windows".

finalName=$(dirname ${path#*/}) 
+0

-1 To jest równoważne 'dirname $ path' – l0b0

+0

@ I0b0 dzięki za wskazanie, że obecnie. – suspectus

+0

To nadal nie powoduje pobrania podstawowej nazwy katalogu. Spróbuj na przykład z 'path =/test/90_2a5/Windows' – l0b0

1

Właściwie możesz to zrobić bez żadnego zewnętrznego programu, takiego jak dirname lub basename, tylko za pomocą operacji manipulowania ciągiem bash:

path="test/90_2a5/Windows" 
# delete from last/to end 
dir=${path%/*} 
# delete from beginning to last/
finalName=${dir##*/} 
echo "$finalName" 
6
$ echo 'test/90_2a5/Windows' | xargs dirname | xargs basename 
90_2a5