2012-09-07 19 views
6
yılında f

bu basit döngü düşünün:Basit Bash - *

for f in *.{text,txt}; do echo $f; done 

Ben SADECE geçerli bir dosya adlarını yankı istiyorum. Bir komut dosyasında $ f değişkenini kullanarak, bu uzantıya ait dosyalar olmadıkça her şey harika çalışır.

*.text 
*.txt 

ziyade yankılanan şey: Boş bir setin durumda, $ f * .text ve yukarıdaki satır Yankılanmayı ayarlanır. Bu gerçek bir gerçek dosya adı bekliyor ve bunun yerine * alır her şey için $ f kullanmaya çalışıyorsanız, bir hata oluşturur.

Joker karakterle eşleşen herhangi bir dosya varsa, boş bir set olmadığından, her şey istediğim gibi çalışır. Örneğin.

123.text 
456.txt 
789.txt 

nasıl hatasız ve yıldız işareti için ilk dize eşleşen $ f görünüşte aşırı karmaşıklığı olmadan bunu yapabilir mi?

cevap

13

nullglob seçeneğini ayarlayın. iyon.

$ for f in *.foo ; do echo "$f" ; done 
*.foo 
$ shopt -s nullglob 
$ for f in *.foo ; do echo "$f" ; done 
$ 
+0

Bu tam olarak aradığım şey. Teşekkürler! – user1610022

3

dosya gerçekte var olmadığını test edebilirsiniz:

for f in *.{text,txt}; do if [ -f $f ]; then echo $f; fi; done 

veya find komutunu kullanabilirsiniz: Eğer ls dış kullanımını gelemez, ayrıca

for f in $(find -name '*.text' -o -name '*.txt'); do 
    echo $f 
done 
+0

$ f aslında bir dosya olup olmadığını sınama yeterli bir şekilde çalışır. Ancak, kaçınmayı umduğum ek bir test. – user1610022

0

, kaçıp sonuçlarını kullanarak

+0

Dosya adları boşluk içeriyorsa çalışmaz. – choroba

+0

Hangi $ IFS'yi doğru şekilde ayarlayarak sabitlenebilir. Nullglob seçeneğinin tersine, bu, bir kabuk betiğinin içinde, çekilmeye çağırmaksızın oldukça güvenli bir şekilde gerçekleşebilir. – ThePadawan

+0

Lütfen nasıl olduğunu gösterin. Ayrıca, shopt' bir yerleşiktir, bu yüzden "dışarı" demezsiniz. – choroba