在Bash中,如何将具有多个条件的正则表达式与文件名匹配?例如,我想匹配.txt或.log结尾的所有文件.
我知道如何匹配一种标准:
for file in *.log
do
echo "${file}"
done
Run Code Online (Sandbox Code Playgroud)
逻辑的语法是什么,或者匹配两种或更多类型的标准?
thk*_*ala 19
当globbing(文件名匹配)时,Bash本身不支持正则表达式.然而,它的全局语法可以非常通用.例如:
for i in A*B.{log,txt,r[a-z][0-9],c*} Z[0-5].c; do
...
done
Run Code Online (Sandbox Code Playgroud)
将在所有以A开头并以B结尾的文件中应用循环内容,然后是一个点和以下任何扩展:
它还将循环命令应用于以Z开头的文件,然后是0-5范围内的数字,然后是.c扩展名.
如果你真的想要/需要,你可以使用内置的shopt启用扩展的globbing:
shopt -s extglob
Run Code Online (Sandbox Code Playgroud)
然后在匹配文件名时允许显着更多的功能,例如子模式等.
有关支持的表达式的更多信息,请参阅Bash手册:
http://www.gnu.org/software/bash/manual/bash.html#Pattern-Matching
编辑:
如果表达式与文件名不匹配,默认情况下bash将替换表达式本身(例如,它将回显*.txt)而不是空字符串.您可以通过设置nullglob shell选项来更改此行为:
shopt -s nullglob
Run Code Online (Sandbox Code Playgroud)
这将替换没有匹配文件的*.txt和空字符串.
编辑2:
我建议你也检查shopt内置及其选项,因为它们中的很多都会影响文件名模式匹配,以及shell的其他方面:
http://www.gnu.org/software/bash/manual/bash.html#The-Shopt-Builtin
Joh*_*ica 15
以您调用的方式执行此操作ls.您可以一个接一个地指定多个通配符:
for file in *.log *.txt
Run Code Online (Sandbox Code Playgroud)