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


123

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

Ответы:


204
dirname $file

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


+1, опереди меня. был бы быстрее, но ему было предложено ввести больше, чемdirname $file
матчев

1
dirname "$file", скорее. Без кавычек это будет неправильно, если в имени файла или каталога есть пробелы.
Чарльз Даффи

fml, вопрос должен заключаться в извлечении абсолютного каталога из файла, как мне это сделать? dirname дает относительный путь, я думаю
Александр Миллс

Поразительно, насколько сложно этого добиться в сценарии Win Batch - я полагаю, еще одна причина не использовать их!
бункерное погружение

47
dirname $file

выведет

stuff/backup

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

basename $file

выведет

file.zip

Я подумал, что Мэтт сможет понять это оттуда (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. Надеюсь, поможет! :-)


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

1
... конечно, вы можете ветвиться: case $file in */*) dir=${file%/*};; *) dir=.;; esacпо-прежнему POSIX-y и решает проблему.
Чарльз Даффи


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.