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.