Jawaban:
Kedengarannya seperti Anda ingin nama dasar dari dirname:
$ filepath=/a/b/c/d/file
$ parentname="$(basename "$(dirname "$filepath")")"
$ echo "$parentname"
d
dirname
perintah akan menganggap itu ada di direktori saat ini (alias ".").
parentname="$(basename "$(dirname "$pwd")")"
PWD
harus ditulis dengan huruf besar . Coba parentname="$(basename "$(dirname "$PWD")")"
.
Anda dapat menggunakan pwd untuk mendapatkan direktori kerja saat ini, dan menggunakan ekspansi parameter untuk menghindari forking ke shell (sub) lain.
echo ${PWD##*/}
Edit: sumber yang terbukti
${path##*/}
Saya pikir ini adalah solusi yang kurang sumber daya:
$ filepath=/a/b/c/d/file
$ echo ${${filepath%/*}##*/}
d
sunting: Maaf, ekspansi bersarang tidak mungkin dilakukan di bash, tetapi berfungsi di zsh. Versi bash:
$ filepath=/a/b/c/d/file
$ path=${filepath%/*}
$ echo ${path##*/}
d
filepath=file
atau filepath = / file`.
foofile
? Jika tidak path lengkap tidak bisa tahu (mungkin jika foofile
file yang ada tidak hanya "string").
Dalam bash, dalam satu baris:
$ dirname /a/b/c/d/file | sed 's,^\(.*/\)\?\([^/]*\),\2,'
Saya suka jawaban Julian67 di atas yang terbaik, tapi ini sedikit versi yang diperluas:
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"