Відповіді:
Це звучить , як ви хочете , щоб базове ім'я з на імені папки:
$ filepath=/a/b/c/d/file
$ parentname="$(basename "$(dirname "$filepath")")"
$ echo "$parentname"
d
dirname
команда припускає, що воно знаходиться в поточному каталозі (aka ".").
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. Баш-версія:
$ 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"