Ответы:
Это звучит , как вы хотите , чтобы базовое имя из на имени папки:
$ filepath=/a/b/c/d/file
$ parentname="$(basename "$(dirname "$filepath")")"
$ echo "$parentname"
d
dirname
команда будет считать, что оно находится в текущем каталоге (он же ".").
parentname="$(basename "$(dirname "$pwd")")"
PWD
должны быть написаны заглавными буквами. Попробуй parentname="$(basename "$(dirname "$PWD")")"
.
Вы можете использовать pwd, чтобы получить текущий рабочий каталог, и использовать расширение параметров, чтобы избежать разветвления его в другую (под) оболочку.
echo ${PWD##*/}
Редактировать: проверенный источник
${path##*/}
Я думаю, что это решение с меньшими ресурсами:
$ filepath=/a/b/c/d/file
$ echo ${${filepath%/*}##*/}
d
edit: Извините, вложенное расширение невозможно в bash, но оно работает в zsh. Bash-версия:
$ filepath=/a/b/c/d/file
$ path=${filepath%/*}
$ echo ${path##*/}
d
filepath=file
или filepath = / file`.
foofile
? Если это не полный путь, не могу знать (возможно, если foofile
существующий файл не только «строка»).
В bash, в одну строку:
$ dirname /a/b/c/d/file | sed 's,^\(.*/\)\?\([^/]*\),\2,'
Мне больше нравится ответ 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"