2013-02-12 27 views
17

Bir dizinde çeşitli dosyalarınız var - .txt, .sh ve daha sonra dosyaları .foo değiştiricisiz olarak planlayın.bash ~ dizinde belirli dosyalar üzerinde döngü için

blah.txt 
blah.sh 
blah 
blahs 

nasıl For döngüsü sadece .foo olmadan dosyaları kullanmak için bir değiştirme söyleyeceğiz: Eğer dizin ls Eğer

? Yukarıdaki örnekte dosyalar "blah" ve "blahs" yapmak.

temel sözdizimi şöyledir:

#!/bin/bash 
FILES=/home/shep/Desktop/test/* 

for f in $FILES 
do 
    XYZ functions 
done 

Bu etkili bir dizinde her şeyin üzerinde döngüler görebileceğiniz gibi. .sh, .txt veya başka herhangi bir değiştiriciyi nasıl hariç tutabilirim?

Bazı ifadelerle birlikte çalıyordum ama değiştirilmemiş dosyalar için seçebilir miyim gerçekten merak ediyorum.

Ayrıca birisi .txt olmadan bu düz metin dosyaları için bana uygun jargonu söyleyebilir mi?

cevap

29
#!/bin/bash 
FILES=/home/shep/Desktop/test/* 

for f in $FILES 
do 
if [[ "$f" != *\.* ]] 
then 
    DO STUFF 
fi 
done 
+0

Bu benim için değiştirilmiş bir biçimde çalışır. Bazı dosya ismlerim "." Içeriyor, bu yüzden * \. * Kullanarak hala onları seçebilirsiniz. Kodunuz için n ne kullanılır? Teşekkür ederim! –

+1

Sadece bash için endif (eğer geriye doğru). –

+0

hmm bu yüzden 'done' if ifadesini kapatmak için gereken bir hata attı. Harika teşekkürler. –

1

Negatif joker karakterler kullanabilirsiniz? Onları filtrelemek için:

bunu biraz daha karmaşık, sen buluntu komutunu kullanabilirsiniz istiyorsanız
$ ls -1 
a.txt 
b.txt 
c.png 
d.py 
$ ls -1 !(*.txt) 
c.png 
d.py 
$ ls -1 !(*.txt|*.py) 
c.png 
+0

Tamam, ama ben onlardan daha çok ikisiyle bir dizin olduğunu varsayalım. Bash bunu benim için yapmanın mantıklı bir yolu var mı? Böylece aynı şekilde çalışırken çoğu dizinlerde uygulanabilir. –

+0

@jon_shep: İkiden fazlası nedir? – Blender

+0

dosya uzantıları. Örneğinizde bunları manuel olarak hariç tutmak zorundaydınız. –

10

. geçerli dizine için

:

for i in `find . -type f -regex \.\\/[A-Za-z0-9]*` 
do 
WHAT U WANT DONE 
done 

açıklama:

find . -> starts find in the current dir 
-type f -> find only files 
-regex -> use a regular expression 
\.\\/[A-Za-z0-9]* -> thats the expression, this matches all files which starts with ./ 
(because we start in the current dir all files starts with this) and has only chars 
and numbers in the filename. 

http://infofreund.de/bash-loop-through-files/

+0

İyi şeyler gibi daha iyi yapılır! Bu komutu kendim kullanmıyorum –