递归删除目录中名称中包含“WIDTHxLENGTH”的文件

递归删除目录中名称中包含“WIDTHxLENGTH”的文件

我有一个包含子目录的目录,我想删除名为 的图像thumbnail-name_WIDTHxLENGTH.{jpg,png},其中WIDTHLENGTH都是十进制整数,例如box-image-150x150.jpgcircle-image-320x320.png。所以基本上它是任何包含x数字的 jpg/png。

答案1

# Old school way for directory-walking: find (emacs regex; use `(jpg|png)` on BSD find)
# use -iregex for case-insensitive
find some/dir -regex '.*[0-9]+x[0-9]+.\(jpg\|png\)' -delete
# ksh93, zsh & bash: globstar + brace expansion + extglob
# for ksh, use `set -o globstar` first; for bash, use `shopt -s globstar extglob nullglob` first.
# TODO: Too lazy to write zsh cshnullglob and case-insensitive globs
rm -- **/*[0-9]x+([0-9]).{jpg,png}

答案2

术语“正则表达式”(通常)不适用于从命令行选择文件。1  技术术语是路径名扩展,通常称为通配符、模式匹配或通配符扩展。根据你所说的,第一次尝试回答是

rm -- *[0-9]x[0-9]*

它删除当前目录中名称由以下内容组成的每个文件

  • 任意 ( *),后跟
  • 一个数字 ( [0-9]),后跟
  • 这封信x,后面跟着
  • 另一个数字 ( [0-9]),后接
  • 任何事物 (*)。

可以--保护您免受名称以-.我强烈敦促你这样做

ls -ld -- *[0-9]x[0-9]*

首先,查看哪些文件匹配并将被删除。如果您发现匹配的文件不是您想要的,请使用*[0-9][0-9][0-9]x[0-9][0-9][0-9]*来仅获取包含(至少)一个三位数、x和另一个三位数的文件。和/或附加.jpg(在末尾;即使用*[0-9]x[0-9]*.jpg)将命令限制为具有该扩展名的文件,然后使用 重复该命令.png。或者,使用

R M-我-- *[0-9]x[0-9]*

要求rm您确认每个文件。

您提到“一个包含目录的目录。它们都有 jpg。”如果您需要搜索目录树,一种方法是键入

shopt -u globstar

然后添加**/通配符;即添加在开头;例如,

rm -i -- **/*[0-9]x[0-9]*

扫描子目录树的另一种方法是

find . -name "*[0-9]x[0-9]*" -type f -exec rm -i -- {} +

您可以通过键入“预览”此命令(查看它将匹配哪些文件)

find . -name "*[0-9]x[0-9]*" -type f -print

同样,如果这匹配太多文件,您可以添加数字和/或添加扩展名。

笔记:

  • 您必须在命令中引用通配符find。您不得在其他命令中引用通配符。
  • find命令将自动查找名称开头的文件.。其他人不会,除非您shopt -s dotglob先输入。
  • find命令将仅作用于纯文件,因为-type f.如果其他文件的名称包含.这对于目录来说不应该是问题,因为不会删除目录。但是,正如我所说,首先执行并仔细检查输出,或者在输入之前使用并思考。numberxnumberrmlsrm -iy

_________
1 find确实具有匹配正则表达式的能力,经过-regex测试,但您不需要它来解决此问题。

答案3

将 find 与 xargs 一起使用:

find / -name "*[0-9]*x*[0-9]*.jpg" | xargs /bin/rm -f

编辑:

find / -name "*[0-9]x[0-9]*.jpg" | xargs /bin/rm -f

或者像下面评论中建议的“authur2e5”一样:

find some/dir -name "*[0-9]x[0-9]*.jpg" -delete

相关内容