如何在unix shell脚本中循环匹配正则表达式的文件

问题描述 投票:0回答:3

我希望能够循环遍历与特定模式匹配的文件列表。我可以使用 ls 和 egrep 以及正则表达式让 unix 列出这些文件,但我找不到一种方法将其转变为迭代过程。我怀疑使用 ls 不是答案。任何帮助将不胜感激。

我当前的 ls 命令如下所示:

ls | egrep -i 'MYFILE[0-9][0-9]([0][1-9]|1[0-2])([0][1-9]|[12][0-9]|[3][01]).dat'

我希望上面的内容能够匹配:

  • 我的文件160418.dat
  • myFILE170312.DAT
  • MyFiLe160416.DaT

但不是:

  • 我的其他文件150202.DAT
  • 我的文件.dat
  • 我的文件.csv

谢谢,

保罗。

regex bash shell unix
3个回答
10
投票

您可以将 (GNU)

find
与正则表达式搜索选项一起使用,而不是解析
ls

find . -regextype "egrep" \
       -iregex '.*/MYFILE[0-9][0-9]([0][1-9]|1[0-2])([0][1-9]|[12][0-9]|[3][01]).dat' \
       -exec [[whatever you want to do]] {} \;

其中

[[whatever you want to do]]
是您要对文件名称执行的命令。

来自手册页

-regextype type
          Changes  the regular expression syntax understood by -regex and -iregex tests 
          which occur later on the command line.  Currently-implemented types are 
          emacs (this is the default),posix-awk, posix-basic, posix-egrep and 
          posix-extended.

  -regex pattern
          File name matches regular expression pattern.  This is a match on the whole 
          path, not a search.  For example, to match a file named `./fubar3', you can 
          use the regular expression
          `.*bar.' or `.*b.*3', but not `f.*r3'.  The regular expressions understood by 
          find are by default Emacs Regular Expressions, but this can be changed with 
          the -regextype option.

  -iregex pattern
          Like -regex, but the match is case insensitive.

9
投票

基于 Andy K 提供的链接,我已使用以下内容根据我的匹配标准进行循环:

for i in $(ls | egrep -i 'MYFILE[0-9][0-9]([0][1-9]|1[0-2])([0][1-9]|[12][0-9]|[3][01]).dat' ); do             
 echo item: $i;         
done

0
投票

我正在寻找列表

sda*
sdb*
/dev
中的一位数字结尾,我发现 ls 在这种情况下可以自行工作:

> /dev/sd[ab][0-9]
/dev/sda1  /dev/sda2  /dev/sda3  /dev/sda4  /dev/sda5  /dev/sda6  /dev/sdb1

但是有一个限制,那就是它不喜欢

+
字符,如果我想搜索例如末尾有几个数字:

> ls /dev/sd[ab][0-9]+
ls: cannot access /dev/sd[ab][0-9]+: No such file or directory

在这里,您确实需要使用

ls | egrep ...
find
,如其他提到的,但由于在您的正则表达式中您没有
+
,这应该对您有用:

ls MYFILE[0-9][0-9]([0][1-9]|1[0-2])([0][1-9]|[12][0-9]|[3][01]).dat
© www.soinside.com 2019 - 2024. All rights reserved.