使用for循环匹配具有各种扩展名的文件

时间:2011-06-03 06:39:50

标签: bash

我正在尝试匹配并循环使用扩展名.txt .h .py的文件。在特定文件夹$ {arg}中。这就是我做的事情

for file in ${arg}/*.{txt, h, py}; do
  ...

done

但是,即使我有这样的文件,我也没有为所有扩展程序提供此类文件。

 line 24: dir1/*.{txt,: No such file or directory
 line 24: h,: No such file or directory
 line 24: py}: No such file or directory

如何使用for循环使用指定扩展名的文件?

3 个答案:

答案 0 :(得分:10)

失去空间; bash关心。

for file in "${arg}"/*.{txt,h,py}; do

答案 1 :(得分:3)

正如Ignacio已经告诉过你应该删除这些空格。如果你想为子目录递归地执行此操作,也可以使用double ** globbing:

for file in ${arg}/**/*.{txt,h,py}
do
    ....
done

ps:仅适用于bash4

答案 2 :(得分:2)

我想对建议的解决方案提出两点改进建议:

一个。 &strong;" $ arg" / 。{txt,h,py} 中的文件也将生成" $ arg&#34 ; / .txt如果没有带有txt扩展的文件并且使用脚本创建错误:

$ echo *.{txt,h,py}
*.txt *.h doSomething.py

为避免这种情况,在for循环之前,设置nullglob以从列表中删除null globs:

$ shopt -s nullglob # Sets nullglob
$ echo *.{txt,h,py}
doSomething.py
$ shopt -u nullglob # Unsets nullglob

B中。如果你还想搜索* .txt或* .TXT甚至* .TxT(即忽略大小写),那么你还需要设置nocaseglob:

$ shopt -s nullglob # Sets nullglob
$ shopt -s nocaseglob # Sets nocaseglob
$ echo *.{txt,h,py}
myFile.TxT doSomething.py
$ shopt -u nocaseglob # Unsets nocaseglob
$ shopt -u nullglob # Unsets nullglob