递归查找以指定模式结尾的文件

递归查找以指定模式结尾的文件

我有很多文件夹,其文件以“-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。默认值(每页)manemacs,但其他选项是posix-awkposix-basicposix-egrepposix-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

相关内容