![递归删除目录中名称中包含“WIDTHxLENGTH”的文件](https://linux22.com/image/76099/%E9%80%92%E5%BD%92%E5%88%A0%E9%99%A4%E7%9B%AE%E5%BD%95%E4%B8%AD%E5%90%8D%E7%A7%B0%E4%B8%AD%E5%8C%85%E5%90%AB%E2%80%9CWIDTHxLENGTH%E2%80%9D%E7%9A%84%E6%96%87%E4%BB%B6.png)
我有一个包含子目录的目录,我想删除名为 的图像thumbnail-name_WIDTHxLENGTH.{jpg,png}
,其中WIDTH
和LENGTH
都是十进制整数,例如box-image-150x150.jpg
和circle-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
.如果其他文件的名称包含.这对于目录来说不应该是问题,因为不会删除目录。但是,正如我所说,首先执行并仔细检查输出,或者在输入之前使用并思考。numberxnumber
rm
ls
rm -i
y
_________
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