18

Я хочу получить только имя родительского каталога для файла.

Пример: Когда у меня есть path=/a/b/c/d/file , я хочу только d а не /a/b/c/d (который я получаю из dirname $path) в качестве вывода.

Есть какой-нибудь изощренный способ сделать это?

5 ответов5

22

Это звучит , как вы хотите , чтобы базовое имя в имени папки:

$ filepath=/a/b/c/d/file
$ parentname="$(basename "$(dirname "$filepath")")"
$ echo "$parentname"
d
4

Вы можете использовать pwd, чтобы получить текущий рабочий каталог, и использовать расширение параметров, чтобы избежать разветвления его в другую (под) оболочку.

echo ${PWD##*/}

Редактировать: проверенный источник

1

В bash, в одну строку:

$ dirname /a/b/c/d/file | sed 's,^\(.*/\)\?\([^/]*\),\2,'
1

Я думаю, что это решение с меньшими ресурсами:

 $ filepath=/a/b/c/d/file
 $ echo ${${filepath%/*}##*/}
 d

edit: Извините, вложенное расширение невозможно в bash, но оно работает в zsh. Bash-версия:

 $ filepath=/a/b/c/d/file
 $ path=${filepath%/*}
 $ echo ${path##*/}
 d
0

Мне больше нравится ответ Julian67 выше, но вот немного расширенная версия:

file_path = "a/b/c/d/file.txt"
parent=$(echo $file_path | sed -e 's;\/[^/]*$;;') # cut away "/file.txt";'$' is end of string
parent=$(echo $parent | sed -e 's;.*\/;;')  # cut away "/a/b/c/"
echo $parent # --> you get "d"

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .