2013-02-12 14 views
17

W katalogu znajdują się różne pliki - .txt, .sh, a następnie pliki planów bez modyfikatora .foo.bash ~ dla pętli nad określonymi plikami w katalogu

Jeśli ls katalogu:

blah.txt 
blah.sh 
blah 
blahs 

Jak mogę opowiedzieć do pętli używać tylko pliki bez .foo modyfikować? Więc "rób rzeczy" na plikach bla i bla bla w powyższym przykładzie.

Podstawowa składnia to:

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

for f in $FILES 
do 
    XYZ functions 
done 

Jak widać to skutecznie pętle nad wszystkim w katalogu. Jak mogę wykluczyć .sh, .txt lub dowolny inny modyfikator?

Gram z niektórymi instrukcjami if, ale jestem naprawdę ciekawy, czy mogę wybrać dla tych niemodyfikowanych plików.

Czy ktoś mógłby mi podać odpowiedni żargon dla plików tekstowych bez pliku .txt?

Odpowiedz

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

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

To działa dla mnie w zmodyfikowanej formie. Niektóre z moich nazw plików zawierają znaki ".", Więc używanie * \. * Nadal może je wybierać. Do czego służy twój kod? Dziękuję Ci! –

+1

To tylko endif dla basha (jeśli jest cofnięty). –

+0

hmm dlatego właśnie "done" spowodował błąd, potrzebny do zamknięcia instrukcji if. Fajne dzięki. –

1

Można użyć ujemnych symboli wieloznacznych? aby je odfiltrować:

$ ls -1 
a.txt 
b.txt 
c.png 
d.py 
$ ls -1 !(*.txt) 
c.png 
d.py 
$ ls -1 !(*.txt|*.py) 
c.png 
+0

Ok, ale że mam katalog z więcej niż dwóch z nich. Czy istnieje logiczny sposób, aby bash zrobił to za mnie? Aby można go było zastosować w większości katalogów podczas pracy w ten sam sposób. –

+0

@jon_shep: Więcej niż dwa z czego? – Blender

+0

rozszerzenia plików. W twoim przykładzie musiałaś ręcznie je wykluczyć. –

10

Jeśli chcesz to trochę bardziej skomplikowane, można użyć Find-polecenie.

W bieżącym katalogu:

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

wyjaśnienie:

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

Dobre rzeczy! Nie wykorzystałem jeszcze tego polecenia –