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?

Jawaban:


26

Kedengarannya seperti Anda ingin nama dasar dari dirname:

$ filepath=/a/b/c/d/file
$ parentname="$(basename "$(dirname "$filepath")")"
$ echo "$parentname"
d

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


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

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,'

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"
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.