使用正则表达式/通配符查找文件

时间:2018-02-20 11:31:53

标签: regex bash find wildcard

在特定目录中,我有一系列按顺序标记的文件:image0000.pngimage0001.pngimage0002.png等。它们用数字标记,但我不是&# 39; t必须知道文件名中有多少个前置零,即它是image0001.png还是image00001.png

在bash脚本中,我希望一次找到一个文件(通过for循环),然后对文件应用一些处理。在我到达终点之前,此搜索可以从零开始,也可以是不同的步骤。要展开,我可能想要找到image0000.pngimage0001.pngimage0002.png等等,或者我可以从image0010.png开始查找所有其他文件,即接下来的两个文件是image0012.pngimage0014.png

为了尝试找到第一个文件(image0000.png),我尝试使用find和ls,输出如下:

$ find video/figs/ -name 'image*[0]0.png'
video/figs/image00100.png
video/figs/image00000.png
$ ls video/figs/image*[0]0.png
-rw-r--r-- 1 user machine 165K Feb 19 09:06 video/figs/image00000.png
-rw-r--r-- 1 user machine 207K Feb 19 09:06 video/figs/image00100.png

找到第二个(即find video/figs/ -name 'image*[0]0.png'找到image00101.pngimage00001.png时会出现类似的结果。所以它找到了我想要的文件(image00001.png),但也找到了一个我不知道的人(image00101.jpg)。任何人都可以帮助我理解为什么,并解决它吗?

3 个答案:

答案 0 :(得分:1)

我会使用lsgrep

ls | grep -oP 0*[1-9]+.png

示例:

$:/tmp/test$ ls
00001.png 00002.png 00010.png 00013.png 00201.png

$:/tmp/test$ ls | grep -oP 0*[1-9]+.png
00001.png
00002.png
00013.png
01.png

答案 1 :(得分:0)

我怀疑你不想潜入子目录,找到按数字排序的文件,分布在子目录中。

所以找不到必要的。

ls image*{08..10}.png
image00010.png  image0008.png  image0009.png  image0010.png  image008.png  image009.png

问题的第2部分,只找到所有其他文件:

ls image*{08..10..2}.png
image00010.png  image0008.png  image0010.png  image008.png

也许你知道for循环。就像那样,

for (i in 8 to 10 by 2) 

for (int i=8; i <= 10; i+=2) 

限制搜索以查找图像image00010.png但不能使用imageAB010.png无效。

排除101的原因尚不清楚。也许它只是一种分类的东西。

对于不是PWD的目录,没有太大的区别:

ls video/figs/image*{08..10..2}.png

请注意,如果程序能够一次处理多个文件,例如ls,则只使用程序,而不是ls,你只想处理文件。

答案 2 :(得分:0)

真诚地感谢所有提供答案的人 - 或许我解释得很糟糕,或者我过于拘泥于我已编写的代码以使用任何提供的答案。但是,我找到了以下解决方案:

1)为什么我找到的答案超出了我的预期?

find video/figs/ -name 'image*[0]0.png'使用非常有限的通配符理解,因此上述内容被解释为查找名为image<wildcard>00.png的文件。使用-name选项无法限制*的应用仅匹配给定字符(在这种情况下,只能找到与0匹配的零个或多个匹配项。

2)如何找到包含未知数量的填充零的图像文件?

以下是我最终代码中的MWE。它演示了如何在给定目录SEARCH_DIR内搜索(不一定包括子目录,但我没有检查过)

f1=0 # Starting number
f2=10 # End number
df=2 # number to skip between images
for ((f=$f1; f<=$f2; f=$f+$df)); do
   export iFile=$(find $SEARCH_DIR -regex '.*/image0*'$f'.png')
done

export确保变量可用于子流程,iFile=$()语法允许我将命令的结果导出到变量iFile。括号内的位是我要找的位:find $SEARCH_DIR -regex '.*/image[0]*'$f'.png'

a)find $SEARCH_DIR指定搜索的位置

b)-regex指定使用正则表达式,它比标准bash脚本更强大,并允许我根据需要限制通配符

c)'.*/image0*'$f'.png':正则表达式搜索查看整个字符串,因此显然我需要初始.*/来执行匹配。 0*现在按照我原来的要求执行 - *通配符现在正在搜索前一项的零个或多个匹配项,这里是0(所以如果我想搜索零或者任何数字的更多匹配,我会使用[0-9]*)。 $f术语是在for循环中搜索编号文件。