Yanıtlar:
Eğer basename istediğiniz gibi geliyor ait dirname:
$ filepath=/a/b/c/d/file
$ parentname="$(basename "$(dirname "$filepath")")"
$ echo "$parentname"
d
dirname
komut geçerli dizinde olduğunu varsayar (aka ".").
parentname="$(basename "$(dirname "$pwd")")"
PWD
bü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=file
veya filepath = / file` ile deneyin .
foofile
nedir? Tam yol değilse yol bilemez (belki foofile
varolan 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"