Вопрос по bash, shell, unix – Захватите имя файла в Unix из полного пути

36

Я пытаюсь получить"abc.txt" снаружи/this/is/could/be/any/path/abc.txt используя команду Unix. Обратите внимание, что/this/is/could/be/any/path динамично

Любая идея?

Заранее спасибо.

Ваш Ответ

4   ответа
56

Вbash:

path=/this/is/could/be/any/path/abc.txt

Если в вашем пути есть пробелы, оберните его"

path="/this/is/could/be/any/path/a b c.txt"

Затем, чтобы извлечь путь, используйтефункция базового имени

file=$(basename "$path")

или же

file=${path##*/}
Он должен быть заключен в двойные кавычки, чтобы избежать проблем с забавными символами в имени файла:file="$(basename $path)" или жеfile="${path##*/}"
file=${path##*/} будет работать вksh также; фактически, bash позаимствовал эту функцию у ksh. любойsh в любой системе Linux, скорее всего, это тоже поддержит.
Вы ответите хорошо, но если разработчик хочет, чтобы скрипт работал с путями, которые имеют пробел, первый ответ должен заключаться в кавычки вокруг $ path, поэтому: file = $ {basename & quot; $ path & quot;}. Я исправил ответ, чтобы исправить это, но я думаю, что он требует вашего одобрения. @ Кейт Томпсон, file = & quot; $ {basename $ path} & quot; не будет работать, кавычки должны быть в $ path, или функция basename не будет работать должным образом.
1

basename /this/is/could/be/any/path/abc.txt

следите за временем ... ответили 12 апреля 12 в 13:15 против 12 апреля 12 в 13:16
6

basename path дает имя файла в конце пути

Редактировать:

Вероятно, стоит добавить, что распространенным шаблоном является использование обратных кавычек вокруг команд, например. `basename ...`, поэтому оболочки UNIX выполнят команду и вернут ее текстовое значение.

Чтобы присвоить результат basename переменной, используйте

x=`basename ...path...`

и $ x будет именем файла.

Я пробовал это, и базовое имя, кажется, падает на пути, где в имени есть пробел.
2

Вы можете использовать команду dirname

$ dirname $path

Похожие вопросы