2010-12-30 7 views

risposta

15

Penso che si possa usare il comando "dirname". Prende in input un percorso file, rimuove la parte nome file e restituisce il percorso. Per esempio:

$ dirname "/string/to/cut.txt" 
/string/to 
1
echo "/string/to/cut.txt" | awk -F'/' '{for (i=1; i<NF; i++) printf("%s/", $i)}' 
+0

Come possiamo farlo usando taglio? – user558134

+0

@ user558134 - non troppo sicuro variabile di supporto taglio per l'ultimo campo, awk è più elegante – ajreal

+0

awk ha risolto il mio problema molto più facilmente e con meno codice, grazie per il suggerimento. –

14

Ciò funzionerà nelle moderne versioni Bourne, come Dash, BusyBox cenere, ecc, così come i discendenti, come Bash, Korn shell e shell Z.

LINE="/string/to/cut.txt" 
LINE=${LINE%/*} 

o per mantenere la barra finale:

LINE=${LINE%/*}/ 
+0

Questa dovrebbe essere la risposta accettata perché è la soluzione più rapida e portatile in quanto funzionerà in qualsiasi shell conforme a POSIX senza richiedere un 'fork'. –

+0

bella soluzione ... grazie – anon

-1

echo $LINE | grep -o '.*/' funziona troppo.

53

Per quel che vale, una soluzione basata su cut:

NEW_LINE="`echo "$LINE" | rev | cut -d/ -f2- | rev`/" 
+0

Credo che questo stia tagliando il primo campo, non l'ultimo? – Michael

+0

@ Michael: l'ho eseguito attraverso alcuni test qui e sembra funzionare bene. In realtà taglia il primo campo, ma inverte (piuttosto in modo inefficiente) la stringa prima e dopo, il che ha l'effetto complessivo desiderato. –

+5

Posso confermare che funziona davvero, in entrambe le implementazioni di taglio Unix e GNU. Ovviamente la risposta dirname è migliore per il caso d'uso specifico dell'OP, ma ho trovato questo quando cercavo un modo generale per eliminare l'ultimo campo con taglio e questo era. – jdeuce