Wyodrębnij katalog ze ścieżki


123

W moim skrypcie potrzebuję katalogu pliku, z którym pracuję. Na przykład file = "stuff / backup / file.zip" . Potrzebuję sposobu, aby uzyskać ciąg „ rzeczy / kopia zapasowa / ” ze zmiennej $file.

Odpowiedzi:


204
dirname $file

jest tym, czego szukasz


+1, pokonaj mnie. byłby szybszy, ale polecono mu wejść więcej niżdirname $file
matchew

1
dirname "$file"raczej. Bez cudzysłowów będzie to źle działać, jeśli nazwa pliku lub katalogu zawiera spacje.
Charles Duffy,

fml, pytanie powinno brzmieć: wyodrębnij katalog absolutny z pliku, jak mam to zrobić? dirname wydaje mi się, że wskazuje ścieżkę względną
Alexander Mills,

To niesamowite, jak trudno jest to osiągnąć w skrypcie wygrywającym Batch - to chyba kolejny powód, aby ich nie używać!
nurkowanie z bunkrem

47
dirname $file

wyjdzie

stuff/backup

co jest przeciwieństwem basename:

basename $file

wyjdzie

file.zip

Pomyślałem, że Matt będzie w stanie to wymyślić (man dirname) :)
Matthieu

1
Myślę, że wszyscy jesteśmy tutaj Mattem. Zgaduję. Ale ja tylko próbowałem odróżnić moją odpowiedź od twojej. =)
matchew

Tak, często używam basename, jest bardzo fajne =) Ale nie mogłem po prostu znaleźć nic o zwracaniu katalogu pliku w Google! Chyba nie szukałem odpowiednich słów. Hah, cała nasza trójka Matt? : D
Matt

1
Rozważ dodanie niezbędnych cudzysłowów, aby upewnić się, że te polecenia działają z nazwami zawierającymi spacje (znaki globu itp.).
Charles Duffy,

3

Korzystanie z ${file%/*}sugestii Urvin / LuFFy jest technicznie lepsze, ponieważ nie będziesz polegać na zewnętrznym poleceniu. Aby uzyskać nazwę basenową w ten sam sposób, co możesz zrobić ${file##*/}. Nie ma potrzeby używania zewnętrznego polecenia, chyba że jest to konieczne.

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

W ten sposób byłby również w pełni zgodny z POSIX. Mam nadzieję, że to pomoże! :-)


1
Jest jeden przypadek, w którym dirnamema przewagę nad (bardziej wydajnym) podejściem wbudowanym, a to wtedy, gdy nie masz pewności, że Twoja ścieżka jest w pełni kwalifikowana na początek. Jeśli masz file=file.zip, dirname "$file"wróci ., a ${file%/*}wróci file.zip.
Charles Duffy

1
... oczywiście możesz rozgałęzić: case $file in */*) dir=${file%/*};; *) dir=.;; esacjest nadal POSIX-y i rozwiązuje problem.
Charles Duffy,

2

Aby dostać się directorypathz filepath:

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

1

Po prostu użyj $ dirname /home/~username/stuff/backup/file.zip

Wróci /home/~username/stuff/backup/

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.