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

Mar*_*ark 4 bash

我试图匹配并循环扩展.txt .h .py文件.在特定文件夹$ {arg}中.这就是我做的

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

done
Run Code Online (Sandbox Code Playgroud)

但是,即使我有这样的文件,我的所有扩展都没有这样的文件.

 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
Run Code Online (Sandbox Code Playgroud)

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

Ign*_*ams 11

失去空间; bash关心.

for file in "${arg}"/*.{txt,h,py}; do
Run Code Online (Sandbox Code Playgroud)


jm6*_*666 5

正如伊格纳西奥已经告诉你应该删除空格。如果您也想对子目录递归地执行此操作,请使用双**通配符:

for file in ${arg}/**/*.{txt,h,py}
do
    ....
done
Run Code Online (Sandbox Code Playgroud)

ps:仅适用于bash4


Nic*_*eek 5

我想建议对建议的解决方案进行2项改进:

答:如果不存在具有txt扩展名的文件,并且在脚本中产生错误,则“ $ arg” /。{txt,h,py}中for文件也将生成“ $ arg” / .txt。

$ echo *.{txt,h,py}
*.txt *.h doSomething.py
Run Code Online (Sandbox Code Playgroud)

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

$ shopt -s nullglob # Sets nullglob
$ echo *.{txt,h,py}
doSomething.py
$ shopt -u nullglob # Unsets nullglob
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)