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