Bir dosyanın üst dizinini alın


24

Bir dosya için sadece üst dizinin adını almak istiyorum.

Örnek: Sahip olduğumda path=/a/b/c/d/file, yalnızca istiyorum dve çıktı olarak değil /a/b/c/d( istediğim dirname $path).

Bunu yapmanın karmaşık bir yolu var mı?

Yanıtlar:


26

Eğer basename istediğiniz gibi geliyor ait dirname:

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

neden alıyorum. debian üst dizin yerine?
Amir

@Amir: Tam bir yolla mı yoksa sadece bir dosya adıyla mı başlıyorsunuz? Bu sadece bir dosya adı ise, dirnamekomut geçerli dizinde olduğunu varsayar (aka ".").
Gordon Davisson

iyi, bunu kullanıyorum:parentname="$(basename "$(dirname "$pwd")")"
Amir

1
@Amir: Kabuk değişkenleri büyük / küçük harfe duyarlıdır ve PWDbüyük harfle yazılmalıdır. Deneyin parentname="$(basename "$(dirname "$PWD")")".
Gordon Davisson


2

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

Bu, özellikle tam çok düzeyli bir yol olmadığında iyi işlemeyen bazı kenar durumlar vardır. Örneğin, filepath=fileveya filepath = / file` ile deneyin .
Gordon Davisson

Aslında. Peki üst dizini foofilenedir? Tam yol değilse yol bilemez (belki foofilevarolan bir dosya sadece "dize" değilse).
uzsolt

1

Bash'da, bir satırda:

$ dirname /a/b/c/d/file | sed 's,^\(.*/\)\?\([^/]*\),\2,'

2
lütfen ilgili prosedürleri detaylandırabilir misiniz? gelecekteki okuyuculara yardımcı olabilir. Ayrıca, lütfen 1/2 satır cevap yazmamaya çalışın.
Lorenzo Von Matterhorn

0

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"
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.