Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 使用正则表达式/通配符查找文件_Regex_Bash_Find_Wildcard - Fatal编程技术网

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

Regex 使用正则表达式/通配符查找文件,regex,bash,find,wildcard,Regex,Bash,Find,Wildcard,在特定目录中,我有一系列按顺序标记的文件:image0000.png,image0001.png,image0002.png,等等。。它们是用数字标记的,但我不一定知道文件名中有多少个前面的零,也就是说,它是image0001.png还是image00001.png 在bash脚本中,我希望一次找到一个文件(通过for循环),然后对该文件应用一些处理。这个搜索可以从零开始,在我到达终点之前结束,也可以是不同的步骤。要扩展,我可以查找image0000.png,image0001.png,imag

在特定目录中,我有一系列按顺序标记的文件:
image0000.png
image0001.png
image0002.png
,等等。。它们是用数字标记的,但我不一定知道文件名中有多少个前面的零,也就是说,它是
image0001.png
还是
image00001.png

在bash脚本中,我希望一次找到一个文件(通过for循环),然后对该文件应用一些处理。这个搜索可以从零开始,在我到达终点之前结束,也可以是不同的步骤。要扩展,我可以查找
image0000.png
image0001.png
image0002.png
等等,或者我可以从
image0010.png
开始查找其他文件,即接下来的两个文件是
image0012.png
image0014.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'
find
image00101.png
image00001.png
)时也会出现类似的结果。因此,它找到了我想要的文件(
image00001.png
),但也找到了我不想要的文件(
image00101.jpg
)。有人能帮我理解原因并解决吗?

我会使用
ls
grep
来解决这个问题:

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

我怀疑您不想深入到子目录中,然后在子目录中查找按编号排序的文件

所以没有必要去寻找

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 (i in 8 to 10 by 2) 


请注意,如果程序一次可以处理多个文件(如ls),而不是ls,您只需使用程序,就可以对文件进行处理。

衷心感谢所有提供答案的人-也许我解释得不好,或者我太执着于我已经编写的代码,无法使用任何提供的答案。但是,我找到了以下解决方案:

1)为什么我找到了比预期更多的答案?

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

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

以下是我最终代码中的MWE。它演示了如何在给定目录中搜索
search\u DIR
(不一定包括子目录,但我没有选中)

f1=0#起始编号
f2=10#端号
df=2#在图像之间跳过的编号

对于((f=$f1;f谢谢-有没有办法限制*)的表达?我一直希望
*[0]
表明我在寻找零个或更多匹配的
0
,但这可能比Wilccard允许的正则表达式要多。值得注意的是,
查找视频/皮肤/无花果/-regex'图像*[0]1.png'
根本找不到匹配项。找不到i00101.png的标准是什么?这是一个数字(101),前面有零(00)。为什么允许使用i00000.png?i00011.png也可以?只允许在左侧使用零?抱歉没有让它更清楚-我正在尝试查找文件1,然后是文件2,然后是文件3,等等。(可能是文件1,然后是文件3,依此类推)。因此,正如您猜测的那样,我只希望在我要查找的数字文件的左边有零。@WiktorStribiżew:不起作用。请尝试
触摸image00{8..12}.png;触摸image000{8..12}.png
。除了不按点前的数字排序外,它还包括image0010.png,这是禁忌,但原因不明。@WiktorStribiżew:但im0101.png不是。为什么?正则表达式中缺少0位,例如,它对“0010.png”无效。我刚刚编辑了您的答案,以匹配以“0”结尾的数字。@vbarboza我以为OP想要排除这些数字。那么您就错了,对不起!这与image0000.png不匹配。@userunknown我不确定OP是否想要它。现在这个问题对我来说有点模糊,我正在等待OP对我答案的输入。
for (int i=8; i <= 10; i+=2) 
ls video/figs/image*{08..10..2}.png
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