Dizini yoldan çıkart


123

Komut dosyamda çalıştığım dosyanın dizinine ihtiyacım var. Örneğin, file = "stuff / backup / file.zip" . Değişkenden " stuff / backup / " dizesini almanın bir yolunu bulmalıyım $file.

Yanıtlar:


204
dirname $file

aradığın şey


+1, beni yen. daha hızlı olabilirdi ancak şundan fazlasını girmeye teşvik edildidirname $file
maç

1
dirname "$file", daha doğrusu. Tırnak işaretleri olmadan, dosya veya dizin adında boşluklar varsa bu yanlış davranır.
Charles Duffy

fml, soru dosyadan mutlak dir ayıklanmalı, bunu nasıl yaparım? dirname göreceli yol
Alexander Mills

Bunu bir Win Batch komut dosyasında başarmanın ne kadar zor olduğu olağanüstü - onları kullanmamak için başka bir neden herhalde!
bunkerdive

47
dirname $file

çıktı verecek

stuff/backup

ki bunun tam tersi basename:

basename $file

çıktı

file.zip

Matt'in oradan anlayabileceğini düşündüm (adam dirname) :)
Matthieu

1
Sanırım hepimiz Matt’in buradayız. Sadece bir tahmin. Ama ben sadece cevabımı sizinkinden ayırmaya çalışıyordum. =)
matchew

Evet, basename'i de çok kullanıyorum, çok şık =) Ama Google'da dosyanın dizinini döndürmekle ilgili hiçbir şey bulamadım! Sanırım doğru kelimelere bakmıyordum. Hah, üçümüz de Matt'in mi? : D
Matt

1
Bu komutların boşluk içeren adlarla (glob karakterleri vb.) Çalıştığından emin olmak için gerekli tırnak işaretlerini eklemeyi düşünün.
Charles Duffy

3

${file%/*}Urvin / LuFFy tarafından önerildiği gibi kullanmak , harici bir komuta güvenmeyeceğiniz için teknik olarak daha iyidir. Baz adını yapabildiğiniz şekilde almak için ${file##*/}. Gerekmedikçe harici bir komut kullanmak gereksizdir.

file="/stuff/backup/file.zip"
filename=${1##*/}     # file.zip
directory=${1%/*}     # /stuff/backup

Ayrıca bu şekilde tamamen POSIX uyumlu olacaktır. Umarım yardımcı olur! :-)


1
Yerleşik yaklaşıma göre (daha verimli) bir avantaja sahip olan bir durum dirnamevardır ve bu, yolunuzun başlamak için tamamen nitelikli olduğundan emin değilseniz. Eğer varsa file=file.zip, dirname "$file"geri dönecek ., oysa ${file%/*}dönecektir file.zip.
Charles Duffy

1
... tabii ki dallanabilirsiniz: case $file in */*) dir=${file%/*};; *) dir=.;; esachala POSIX-y'dir ve sorunu çözmektedir.
Charles Duffy

2

Şuradan almak directorypathiçin filepath:

file="stuff/backup/file.zip"
dirPath=${file%/*}/
echo ${dirPath}

1

Basitçe kullan $ dirname /home/~username/stuff/backup/file.zip

Geri dönecek /home/~username/stuff/backup/

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.