Dapatkan direktori induk untuk sebuah file

24

Saya hanya ingin mendapatkan nama direktori induk untuk sebuah file.

Contoh: Ketika saya punya path=/a/b/c/d/file, saya hanya ingin ddan tidak /a/b/c/d(yang saya dapatkan dari dirname $path) sebagai output.

Apakah ada cara canggih untuk melakukan ini?

shraddha
sumber

Jawaban:

26

Kedengarannya seperti Anda ingin nama dasar dari dirname:

$ filepath=/a/b/c/d/file
$ parentname="$(basename "$(dirname "$filepath")")"
$ echo "$parentname"
d
Gordon Davisson
sumber
mengapa saya menerima bukannya direktori induk di debian?
Amir
@ Ammir: Apakah Anda memulai dengan path lengkap, atau hanya nama file? Jika itu hanya nama file, dirnameperintah akan menganggap itu ada di direktori saat ini (alias ".").
Gordon Davisson
baik, saya menggunakan ini:parentname="$(basename "$(dirname "$pwd")")"
Amir
1
@ Ammir: Variabel Shell peka huruf besar-kecil, dan PWDharus ditulis dengan huruf besar . Coba parentname="$(basename "$(dirname "$PWD")")".
Gordon Davisson
5

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

api
sumber
Pertanyaannya tidak ada hubungannya dengan direktori saat ini. Anda bisa menggunakan${path##*/}
Matteo
2

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
uzsolt
sumber
Ada beberapa kasus tepi yang tidak ditangani dengan baik, terutama ketika tidak ada jalur bertingkat penuh. Misalnya, coba dengan filepath=fileatau filepath = / file`.
Gordon Davisson
Memang. Tapi apa direktori induknya foofile? Jika tidak path lengkap tidak bisa tahu (mungkin jika foofilefile yang ada tidak hanya "string").
uzsolt
1

Dalam bash, dalam satu baris:

$ dirname /a/b/c/d/file | sed 's,^\(.*/\)\?\([^/]*\),\2,'
julian67
sumber
2
bisa tolong jelaskan prosedur yang terlibat? ini dapat membantu pembaca di masa mendatang. juga, cobalah untuk tidak menulis jawaban 1/2 baris.
Lorenzo Von Matterhorn
0

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"
Dominic van der Zypen
sumber