Estrai directory dal percorso


123

Nel mio script ho bisogno della directory del file con cui sto lavorando. Ad esempio, file = "stuff / backup / file.zip" . Ho bisogno di un modo per ottenere la stringa " stuff / backup / " dalla variabile $file.

Risposte:


203
dirname $file

è quello che stai cercando


+1, battimi. sarebbe stato più veloce, ma è stato suggerito di entrare più didirname $file
matchew

1
dirname "$file", piuttosto. Senza le virgolette ciò si comporterà male se il nome del file o della directory ha spazi.
Charles Duffy,

fml, la domanda dovrebbe essere l'estrazione della directory assoluta dal file, come posso farlo? dirname restituisce il percorso relativo immagino
Alexander Mills

È eccezionale quanto sia difficile da realizzare in uno script batch vincente - un altro motivo per non usarli suppongo!
bunkerdive

47
dirname $file

verrà prodotto

stuff/backup

che è l'opposto di basename:

basename $file

produrrebbe

file.zip

Ho pensato che Matt sarebbe stato in grado di capirlo da lì (man dirname) :)
Matthieu

1
Penso che siamo tutti Matt qui. Solo una supposizione. Ma stavo solo cercando di distinguere la mia risposta dalla tua. =)
matchew

Sì, uso molto anche il nome di base, è molto elegante =) Ma non sono riuscito a trovare nulla sulla restituzione della directory del file su Google! Immagino che non stavo cercando le parole giuste. Hah, tutti e 3 di noi Matt? : D
Matt

1
Considera l'idea di aggiungere le virgolette necessarie per assicurarti che questi comandi funzionino con nomi contenenti spazi (caratteri glob, ecc.).
Charles Duffy,

3

Usare ${file%/*}come suggerito da Urvin / LuFFy è tecnicamente migliore poiché non ti affidi a un comando esterno. Per ottenere il nome di base nello stesso modo in cui potresti fare ${file##*/}. Non è necessario utilizzare un comando esterno a meno che non sia necessario.

file="/stuff/backup/file.zip"
filename=${1##*/}     # file.zip
directory=${1%/*}     # /stuff/backup

Sarebbe anche completamente conforme a POSIX in questo modo. Spero che sia d'aiuto! :-)


1
C'è un caso in cui dirnameha un vantaggio rispetto all'approccio integrato (più efficiente), e questo è se non sei sicuro che il tuo percorso sia pienamente qualificato per iniziare. Se lo hai file=file.zip, dirname "$file"tornerà ., mentre ${file%/*}tornerà file.zip.
Charles Duffy,

1
... ovviamente, puoi ramificare: case $file in */*) dir=${file%/*};; *) dir=.;; esacè ancora POSIX-y e risolve il problema.
Charles Duffy,

2

Per ottenere directorypathda filepath:

file="stuff/backup/file.zip"
dirPath=${file%/*}/
echo ${dirPath}

1

Basta usare $ dirname /home/~username/stuff/backup/file.zip

Tornerà /home/~username/stuff/backup/

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.