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
.
123
dirname $file
jest tym, czego szukasz
dirname $file
dirname "$file"
raczej. Bez cudzysłowów będzie to źle działać, jeśli nazwa pliku lub katalogu zawiera spacje.wyjdzie
co jest przeciwieństwem
basename
:wyjdzie
źródło
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.W ten sposób byłby również w pełni zgodny z POSIX. Mam nadzieję, że to pomoże! :-)
źródło
dirname
ma 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 maszfile=file.zip
,dirname "$file"
wróci.
, a${file%/*}
wrócifile.zip
.case $file in */*) dir=${file%/*};; *) dir=.;; esac
jest nadal POSIX-y i rozwiązuje problem.Aby dostać się
directorypath
zfilepath
:źródło
Po prostu użyj
$ dirname /home/~username/stuff/backup/file.zip
Wróci
/home/~username/stuff/backup/
źródło