Витягнути каталог із шляху


123

У моєму сценарії мені потрібен каталог файлу, з яким я працюю. Наприклад, файл = "stuff / backup / file.zip" . Мені потрібен спосіб отримати рядок " stuff / backup / " зі змінної $file.

Відповіді:


203
dirname $file

це те, що ви шукаєте


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

1
dirname "$file", скоріше. Без лапок це буде неправильно, якщо у файлі чи в каталозі є пробіли.
Чарльз Даффі

fml, питання має витягнути абсолютний dir з файлу, як це зробити? dirname дає відносний шлях, я думаю
Олександр Міллз

Визначно, наскільки важко це досягти у виграшному пакетному сценарії - я думаю, ще одна причина не використовувати їх!
bunkerdive

47
dirname $file

виведе

stuff/backup

що протилежне basename:

basename $file

виведе

file.zip

Я подумав, що Метт зможе зрозуміти це звідти (ім'я чоловіка) :)
Matthieu

1
Я думаю, що ми всі Метт тут. Просто здогадка. Але я просто намагався відрізнити свою відповідь від вашої. =)
матч

Так, я теж дуже часто використовую базове ім'я, це дуже чудово =) Але я просто не міг знайти нічого про повернення файлу файлу в Google! Я думаю, я не шукав правильних слів. Га, всі 3 з нас Метта? : 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 і вирішує проблему.
Чарльз Даффі


1

Просто використовуйте $ dirname /home/~username/stuff/backup/file.zip

Це повернеться /home/~username/stuff/backup/

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.