Yanıtlar:
Eğer basename istediğiniz gibi geliyor ait dirname:
$ filepath=/a/b/c/d/file
$ parentname="$(basename "$(dirname "$filepath")")"
$ echo "$parentname"
d
dirnamekomut geçerli dizinde olduğunu varsayar (aka ".").
parentname="$(basename "$(dirname "$pwd")")"
PWDbüyük harfle yazılmalıdır. Deneyin parentname="$(basename "$(dirname "$PWD")")".
Geçerli çalışma dizinini almak için pwd'yi kullanabilir ve başka bir (alt) kabuğa çatallamaktan kaçınmak için parametre genişletmeyi kullanabilirsiniz .
echo ${PWD##*/}
Düzenleme: kanıtlanmış kaynak
${path##*/}
Bunun daha az kaynak gerektiren bir çözüm olduğunu düşünüyorum:
$ filepath=/a/b/c/d/file
$ echo ${${filepath%/*}##*/}
d
edit: Üzgünüm, iç içe genişleme bash mümkün değil, ama zsh çalışır. Bash-sürümü:
$ filepath=/a/b/c/d/file
$ path=${filepath%/*}
$ echo ${path##*/}
d
filepath=fileveya filepath = / file` ile deneyin .
foofilenedir? Tam yol değilse yol bilemez (belki foofilevarolan bir dosya sadece "dize" değilse).
Bash'da, bir satırda:
$ dirname /a/b/c/d/file | sed 's,^\(.*/\)\?\([^/]*\),\2,'
Julian67'nin cevabını en iyi şekilde beğeniyorum, ancak burada biraz genişletilmiş bir sürüm var:
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"