在特定目录中,我有一系列按顺序标记的文件:image0000.png
,image0001.png
,image0002.png
等。它们用数字标记,但我不是&# 39; t必须知道文件名中有多少个前置零,即它是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'
找到image00101.png
和image00001.png
时会出现类似的结果。所以它找到了我想要的文件(image00001.png
),但也找到了一个我不知道的人(image00101.jpg
)。任何人都可以帮助我理解为什么,并解决它吗?
答案 0 :(得分:1)
我会使用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
答案 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循环中搜索编号文件。