2013-02-12 81 views
17

在目錄中,您有一些各種文件 - .txt.sh,然後計劃沒有.foo修改器的文件。bash〜用於循環目錄中的特定文件

如果ls目錄:

blah.txt 
blah.sh 
blah 
blahs 

如何判斷一個for循環僅使用文件沒有.foo修改?因此,在上面的例子中,對文件等等和「等等」做「東西」。

的基本語法是:

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

for f in $FILES 
do 
    XYZ functions 
done 

正如你可以看到這有效地遍歷目錄中的所有內容。我如何排除.sh,.txt或任何其他修飾符?

我一直在玩一些if語句,但我真的很好奇,如果我可以選擇那些未修改的文件。

也可以有人告訴我這些純文本文件沒有.txt適當的術語?

回答

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

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

這適用於我修改後的表單。我的一些文件名包含「。」,因此使用* \。*仍然可以選擇它們。什麼是你的代碼使用的fi?謝謝! – 2013-02-13 18:01:48

+1

這只是bash的endif(如果向後)。 – 2013-02-13 18:09:05

+0

嗯,這將是爲什麼「完成」拋出一個錯誤,需要關閉if語句。很感謝。 – 2013-02-13 18:21:34

1

您可以使用否定通配符?將它們過濾出來:

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

好,但說我有一個目錄有兩個以上的人。有沒有一種合乎邏輯的方式讓bash爲我做這件事?這樣它可以應用在大多數目錄中,同時工作。 – 2013-02-12 01:09:14

+0

@jon_shep:超過兩個什麼? – Blender 2013-02-12 01:09:55

+0

文件擴展名。在你的例子中,你必須手動排除它們。 – 2013-02-12 01:11:46

10

如果你想讓它更復雜一點,你可以使用find命令。

對於當前目錄:

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

解釋:

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

好東西!我還沒有自己使用這個命令 – 2014-08-21 05:13:48

相關問題