В моем сценарии мне нужен каталог файла, с которым я работаю. Например, файл = "stuff / backup / file.zip" . Мне нужен способ получить строку « stuff / backup / » из переменной $file.
Я подумал, что Мэтт сможет понять это оттуда (man dirname) :)
Matthieu
1
Я думаю, мы все здесь, Мэтт. Просто предположение. Но я просто пытался отличить свой ответ от вашего. =)
matchew
Да, я тоже часто использую basename, это очень здорово =) Но я просто не смог найти ничего о возврате каталога файла в google! Думаю, я не подбирал нужные слова. Ха, все трое из нас, Мэтт? : D
Мэтт
1
Подумайте о добавлении необходимых кавычек, чтобы эти команды работали с именами, содержащими пробелы (символы глобуса и т. Д.).
Чарльз Даффи
3
Использование ${file%/*}подобного, предложенного Urvin / LuFFy, технически лучше, поскольку вы не будете полагаться на внешнюю команду. Получить базовое имя так же, как и вы ${file##*/}. Нет необходимости использовать внешнюю команду, если она вам не нужна.
Есть один случай, когда dirnameесть преимущество перед (более эффективным) встроенным подходом, и это если вы не уверены, что ваш путь полностью пригоден для начала. Если у вас есть file=file.zip, dirname "$file"вернется ., тогда как ${file%/*}вернется file.zip.
Чарльз Даффи
1
... конечно, вы можете ветвиться: case $file in */*) dir=${file%/*};; *) dir=.;; esacпо-прежнему POSIX-y и решает проблему.
dirname $file
dirname "$file"
, скорее. Без кавычек это будет неправильно, если в имени файла или каталога есть пробелы.выведет
что противоположно
basename
:выведет
источник
Использование
${file%/*}
подобного, предложенного Urvin / LuFFy, технически лучше, поскольку вы не будете полагаться на внешнюю команду. Получить базовое имя так же, как и вы${file##*/}
. Нет необходимости использовать внешнюю команду, если она вам не нужна.Таким образом, он также будет полностью совместим с POSIX. Надеюсь, поможет! :-)
источник
dirname
есть преимущество перед (более эффективным) встроенным подходом, и это если вы не уверены, что ваш путь полностью пригоден для начала. Если у вас естьfile=file.zip
,dirname "$file"
вернется.
, тогда как${file%/*}
вернетсяfile.zip
.case $file in */*) dir=${file%/*};; *) dir=.;; esac
по-прежнему POSIX-y и решает проблему.Для получения
directorypath
отfilepath
:источник
Просто используйте
$ dirname /home/~username/stuff/backup/file.zip
Он вернется
/home/~username/stuff/backup/
источник