Odpowiedzi:
dirname $file
jest tym, czego szukasz
dirname "$file"
raczej. Bez cudzysłowów będzie to źle działać, jeśli nazwa pliku lub katalogu zawiera spacje.
dirname $file
wyjdzie
stuff/backup
co jest przeciwieństwem basename
:
basename $file
wyjdzie
file.zip
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! :-)
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 masz file=file.zip
, dirname "$file"
wróci .
, a ${file%/*}
wróci file.zip
.
case $file in */*) dir=${file%/*};; *) dir=.;; esac
jest nadal POSIX-y i rozwiązuje problem.
Aby dostać się directorypath
z filepath
:
file="stuff/backup/file.zip"
dirPath=${file%/*}/
echo ${dirPath}
Po prostu użyj $ dirname /home/~username/stuff/backup/file.zip
Wróci /home/~username/stuff/backup/
dirname $file