2013-05-31 15 views
7

dato un percorso come questo test/90_2a5/WindowsOttenere il nome della directory del genitore eseguendo il piping dei risultati di nomedir a basename in uno script Bash

Sto cercando di ottenere il risultato 90_2a5 utilizzando i comandi dirname per ottenere il percorso e dopo basename per ottenere il nome.

Il problema si verifica quando provo a farlo in una sola riga cercando di convogliare i risultati da dirname a basename.

Ho provato questo, ma sembra che sto usando nel modo sbagliato.

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

Il problema è che il NomeFinale è una stringa vuota, il che significa che i risultati di dirname non si reindirizza.

risposta

16

Non lo sai tubo di loro, ma piuttosto li passano come parametri:

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

Alcuni comandi semplicemente non accettano flussi di ingresso, ma solo parametri:

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

Ottima risposta! Grazie mille! – stratis

+3

Puoi anche fare ciò 'echo foo/bar | xargs basename'. L'uso di 'xargs' fa sì che il basename accetti lo stream. – jeffreyveon

+0

@jeffreyveon No, 'xargs' trasforma l'input standard in una * lista parametri * per' basename'. – l0b0

0

Utilizzare $ {percorso # * /} per rimuovere i caratteri fino al primo '/'. Quindi utilizzare dirname per rimuovere "/ Windows".

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

-1 Ciò equivale a 'dirname $ path' – l0b0

+0

@ I0b0 grazie per la segnalazione. – suspectus

+0

Questo non sta ancora recuperando il nome base della directory. Prova ad esempio con 'path =/test/90_2a5/Windows' – l0b0

1

realtà , puoi anche farlo senza alcun programma esterno come dirname o basename, semplicemente usando le operazioni di manipolazione della stringa 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 
Problemi correlati