正则表达式用于文件名匹配

时间:2010-11-29 20:25:59

标签: regex bash

在Bash中,如何将具有多个条件的正则表达式与文件名匹配? 例如,我想用.txt或.log结尾匹配所有文件。

我知道如何匹配一种标准:

for file in *.log
do
        echo "${file}"
done

逻辑的语法是什么,或者匹配两种或更多种类型的标准?

6 个答案:

答案 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结尾的文件中应用循环内容,然后以点和以下任何扩展名结束:

  • 日志
  • TXT
  • r后跟一个小写字母,后跟一个数字
  • c后面跟几乎任何东西

它还将循环命令应用于以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