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.

Matt
źródło

Odpowiedzi:

204
dirname $file

jest tym, czego szukasz

Matthieu
źródło
+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
matchew
źródło
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! :-)

MageParts
źródło
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}
Urvin Shah
źródło
1

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

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

Nishchay Sharma
źródło