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