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.