Извлечь каталог из пути

123

В моем сценарии мне нужен каталог файла, с которым я работаю. Например, файл = "stuff / backup / file.zip" . Мне нужен способ получить строку « stuff / backup / » из переменной $file.

Matt
источник

Ответы:

204
dirname $file

это то, что вы ищете

Матье
источник
+1, опереди меня. был бы быстрее, но ему было предложено ввести больше, чемdirname $file
матчев
1
dirname "$file", скорее. Без кавычек это будет неправильно, если в имени файла или каталога есть пробелы.
Чарльз Даффи
fml, вопрос должен заключаться в извлечении абсолютного каталога из файла, как мне это сделать? dirname дает относительный путь, я думаю
Александр Миллс
Поразительно, насколько сложно этого добиться в сценарии Win Batch - я полагаю, еще одна причина не использовать их!
бункерное погружение
47
dirname $file

выведет

stuff/backup

что противоположно basename:

basename $file

выведет

file.zip
matchew
источник
Я подумал, что Мэтт сможет понять это оттуда (man dirname) :)
Matthieu
1
Я думаю, мы все здесь, Мэтт. Просто предположение. Но я просто пытался отличить свой ответ от вашего. =)
matchew
Да, я тоже часто использую basename, это очень здорово =) Но я просто не смог найти ничего о возврате каталога файла в google! Думаю, я не подбирал нужные слова. Ха, все трое из нас, Мэтт? : D
Мэтт
1
Подумайте о добавлении необходимых кавычек, чтобы эти команды работали с именами, содержащими пробелы (символы глобуса и т. Д.).
Чарльз Даффи
3

Использование ${file%/*}подобного, предложенного Urvin / LuFFy, технически лучше, поскольку вы не будете полагаться на внешнюю команду. Получить базовое имя так же, как и вы ${file##*/}. Нет необходимости использовать внешнюю команду, если она вам не нужна.

file="/stuff/backup/file.zip"
filename=${1##*/}     # file.zip
directory=${1%/*}     # /stuff/backup

Таким образом, он также будет полностью совместим с POSIX. Надеюсь, поможет! :-)

MageParts
источник
1
Есть один случай, когда dirnameесть преимущество перед (более эффективным) встроенным подходом, и это если вы не уверены, что ваш путь полностью пригоден для начала. Если у вас есть file=file.zip, dirname "$file"вернется ., тогда как ${file%/*}вернется file.zip.
Чарльз Даффи
1
... конечно, вы можете ветвиться: case $file in */*) dir=${file%/*};; *) dir=.;; esacпо-прежнему POSIX-y и решает проблему.
Чарльз Даффи
2

Для получения directorypathот filepath:

file="stuff/backup/file.zip"
dirPath=${file%/*}/
echo ${dirPath}
Урвин Шах
источник
1

Просто используйте $ dirname /home/~username/stuff/backup/file.zip

Он вернется /home/~username/stuff/backup/

Нищай Шарма
источник