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

Mik*_*ike 12 regex bash

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

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

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

  • @Mike你需要使用shopt构建来设置nullglob shell选项以避免这种情况 (2认同)

mpa*_*pis 6

for f in $(find . -regex ".*\.log")
do 
  echo $f
end
Run Code Online (Sandbox Code Playgroud)