我正在尝试匹配并循环使用扩展名.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
循环使用指定扩展名的文件?
答案 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