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! :-)
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.
case $file in */*) dir=${file%/*};; *) dir=.;; esacjest nadal POSIX-y i rozwiązuje problem.
Aby dostać się directorypathz 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