Ответы:
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