Відповіді:
dirname $file
це те, що ви шукаєте
dirname "$file"
, скоріше. Без лапок це буде неправильно, якщо у файлі чи в каталозі є пробіли.
dirname $file
виведе
stuff/backup
що протилежне basename
:
basename $file
виведе
file.zip
Використовувати, ${file%/*}
як запропоновано Urvin / LuFFy, технічно краще, оскільки ви не будете покладатися на зовнішню команду. Щоб отримати базове ім’я так само, як і ви ${file##*/}
. Зайве використання зовнішньої команди, якщо не потрібно.
file="/stuff/backup/file.zip"
filename=${1##*/} # file.zip
directory=${1%/*} # /stuff/backup
Це також було б повністю сумісним з POSIX. Сподіваюся, це допомагає! :-)
dirname
є перевага перед (більш ефективним) вбудованим підходом, і це, якщо ви не впевнені, що ваш шлях має повну кваліфікацію для початку. Якщо у вас є file=file.zip
, dirname "$file"
повернетесь .
, тоді як ${file%/*}
повернетесь file.zip
.
case $file in */*) dir=${file%/*};; *) dir=.;; esac
все ще POSIX-y і вирішує проблему.
Просто використовуйте $ dirname /home/~username/stuff/backup/file.zip
Це повернеться /home/~username/stuff/backup/
dirname $file