我有很多文件夹,其文件以“-105x135.jpg”、“-410x410.jpg”等、“780-105x135.jpg”和“candyswing-2-klein-ohrringe-schale-038-135x160.jpg”结尾“例如,我需要查找和删除,使用在线正则表达式我创建了此模式:[0-9]x..[0-9].jpg
,但find . -regex '[0-9]x..[0-9].jpg'
没有显示任何结果。
答案1
根据该man
页面,该-regex
选项与整个路径, IE。这全部的文件名和还有整个目录路径部分,因此您需要在正则表达式之前添加.*
.该页面中有几个明确的示例man
。
另外,请记住该选项-regextype
。默认值(每页)man
是emacs
,但其他选项是posix-awk
、posix-basic
和posix-egrep
。posix-extended
把自己打昏。
答案2
另一种选择是使用 bash 的 globstar 选项:
shopt -s globstar
列出:
ls **/*[0-9][0-9][0-9]x[0-9][0-9][0-9].jpg
或删除:
rm **/*[0-9][0-9][0-9]x[0-9][0-9][0-9].jpg
文件。
上面的 glob 模式与您提供的正则表达式略有不同;正则表达式将允许任何后面的两个字符x
,严格来说不是数字。换句话说,名为:的文件somefile-135xyz9.jpg
将匹配正则表达式,但不匹配上面的 glob。
glob 递归地 ( **
) 匹配以下文件:
- 从任何事情开始 (
*
) - 有三个数字(三个
[0-9]
) - 随后是一个
x
- 后面跟着三个数字
- 其次是
.jpg
这种方法的一个风险是匹配文件的数量是否超过命令行参数空间。在这种情况下,您可以将文件名保存在数组中,然后单独循环遍历该数组。
去弄清楚:
files=(**/*[0-9][0-9][0-9]x[0-9][0-9][0-9].jpg)
for file in "${files[@]}"; do echo Would: rm -- "$file"; done
去除:
files=(**/*[0-9][0-9][0-9]x[0-9][0-9][0-9].jpg)
for file in "${files[@]}"; do rm -- "$file"; done