2015-05-05 27 views
5

İçinde dizinler arasında geçiş yapmam gereken bir kabuk komut dosyası yazıyorum ve içlerindeki dosyaların üzerine dönüyorum. Bu yüzden bu fonksiyonu yazdım:Boş dizin içeriğine Döngü Bash

loopdirfiles() { 
    #loop over dirs 
    for dir in "${PATH}"/* 
    do 
     for file in "${dir}"/* 
      do 
       echo $file 
      done 
    done 
} 

sorun boş dizinleri */yol/dir/** gibi bir şey yankıları olmasıdır.

Bu yaklaşımı kullanmak ve bu tür dizinleri yok saymanın bir yolu var mı?

+1

(adlarında başında . dosyaları) gizli dosyaları içerir ** yok **. Bunun için 'PATH' kullanıldığında harici komutları çalıştıracaksınız. Genel olarak, ALL_CAPS değişkenlerinden, kabuk// etc için "ayrılmış" oldukları için (script globals dışında) kaçınılmalıdır. kullanın. –

cevap

2

tamamen görmezden gelmek yerine, dizin adından * kesebilir:

[[ $file == *"*" ]] && file="${file/%\*/}" 
#this goes inside the second loop 

Yoksa boş bir dizin gelmesini istemiyorsanız: Bir başka yöntem

[[ -d $dir && $ls -A $dir) ]] || continue 
#this goes inside the first loop 

:

files=$(shopt -s nullglob dotglob; echo "$dir"/*) 
((${#files})) || continue 
#this goes inside the first loop 

Yoksa tamamen (Etan Reisner tarafından bahsedilen) nullglob ve dotglob etkinleştirebilirsiniz:

shopt -s nullglob dotglob 
#This goes before first loop. 


From Bash Manual

nullglob

seti, Bash hiçbir dosya maç dosya adı desenleri izin verirse 'u kendilerinden ziyade boş bir dizeye genişletin.

dotglob

seti, Bash bir ile başlayan dosya içeren ‘’ Dosyaismi sonuçlarında.

Not: dotglob Eğer komut bir değişken olarak `PATH` kullanıyorsanız

+0

Glob'un başarısız olup olmadığını belirlemek için başarısız bir glob üzerinde 'ls 'çalıştırıyor, bu amaç için nispeten pahalı bir test. –

+0

@EtanReisner, Glob'un başarısız olmadığı ilk döngüde .. – Jahid

+0

Ah true. Bu durumun test edilmesinde göreceli olarak pahalı bir yöntem olduğu için başarısız glob kolayca tespit edilebilir (eğer problemi sadece nullglob ile gidermezseniz). –

4

nullglob option'u açabilirsiniz. Eşsiz glob'lar, genişletilmemiş halde kalmak yerine boş bir listeye genişlemelerine neden olur.

shopt -s nullglob 
+0

Bu seçeneği işlevin dışında ayarladım ve aynı sonucu verdi. – lerp90

+0

'bash' kullandığınızdan ve' sh' kullanmadığınızdan emin olun ve bunu kullanmayı beklediğiniz aynı kabuk oturumunda ayarladığınızdan emin olun (örneğin, geçerli kabuğunuzda ayarlama ve sonra bu işlevle bir komut dosyası çalıştırma bak). –