如何在Linux中删除具有特定模式的文件?

4
我有一组像这样的图片。
12345-image-1-medium.jpg 12345-image-2-medium.png 12345-image-3-large.jpg

我应该编写什么模式来选择并删除这些图片

还有一些不想选择的图片

12345-image-profile-small.jpg 12345-image-profile-medium.jpg 12345-image-profile-large.png

我尝试了这个正则表达式,但是没有起作用。

1234-image-[0-9]+-small.*

我认为Bash不支持像Javascript、Go、Python或Java中的正则表达式。

你尝试过不起作用的模式吗?是什么样的模式? - Benjamin W.
是的,但棘手的部分是选择数字部分。 - TheEhsanSarshar
1
使用ls -al [[:digit:]][[:digit:]][[:digit:]][[:digit:]][[:digit:]]-image-[[:digit:]]*进行测试,如果匹配到你想要删除的内容,然后执行rm [[:digit:]][[:digit:]][[:digit:]][[:digit:]][[:digit:]]-image-[[:digit:]]* - David C. Rankin
我刚刚测试了这个正则表达式 1234-image-[0-9]+-.* 但是没有起作用。 在在线正则表达式测试器https://regex101.com/中它起作用,但是当我在ls命令中使用它时不起作用。 ls 1234-image-[0-9]+-.* - TheEhsanSarshar
不好意思,bash是支持正则表达式的。 - TheEhsanSarshar
显示剩余4条评论
3个回答

4

好的,我用这个模式解决了它

12345-image-*[0-9]-*

eg:

rm -rf 12345-image-*[0-9]-*

它匹配所有以12345-image-开头,然后是一个数字,接着是-符号和任何内容的文件名。

我发现这是在bash中的globbing而不是regex,我发现这个app真的很有用。


这将匹配比你想象的要多得多,但前提是文件名以12345开头。根据你的评论中的"我刚刚测试了这个正则表达式 1234-image-...",你指出数字的位数不固定 -- 这是一个要求吗? - David C. Rankin
我测试过了,它是有效的。我只想选择以特定id开头的文件,然后带有-image-、一个数字和扩展名结尾的文件。 - TheEhsanSarshar

1
for pic in 12345*.{jpg,png};do rm $pic;done

如需了解通配符的更多信息,请查看此处


我刚刚编辑了问题,请查看更新。 - TheEhsanSarshar
请参阅:https://dev59.com/O0wGtIcB2Jgan1znloRA#LXcroYgBc1ULPQZFBp-Q - Cyrus

1
只要您没有包含换行符'\n'的文件名,以下findgrep命令就可以使用:
find . -type f | grep '^.*/[[:digit:]]\{1,5\}-image-[[:digit:]]\{1,5\}'

它将查找当前目录下的所有文件,并匹配(1到5位数字),后跟“-image-”,然后再跟另一个(1到5位数字)。对于以下文件,请参考您的情况:
$ ls -1
123-image-99999-small.jpg
12345-image-1-medium.jpg
12345-image-2-medium.png
12345-image-3-large.jpg
12345-image-profile-large.png
12345-image-profile-medium.jpg
12345-image-profile-small.jpg

您请求的文件除了123-image-99999-small.jpg之外还有其他匹配项,例如。
$ find . -type f | grep '^.*/[[:digit:]]\{1,5\}-image-[[:digit:]]\{1,5\}'
./123-image-99999-small.jpg
./12345-image-3-large.jpg
./12345-image-2-medium.png
./12345-image-1-medium.jpg

您可以在命令替换中使用上述内容来删除文件,例如:
$ rm $(find . -type f | grep '^.*/[[:digit:]]\{1,5\}-image-[[:digit:]]\{1,5\}')

剩余的文件是:

$ l1
12345-image-profile-large.png
12345-image-profile-medium.jpg
12345-image-profile-small.jpg

如果您的find支持-regextype,允许您指定要使用哪个正则表达式语法集,则可以使用-regextype grep来使用grep语法,并使用类似上面的方法使用-execdir选项删除文件,例如:
$ find . -type f -regextype grep -regex '^.*/[[:digit:]]\+-image-[[:digit:]]\+.*$' -execdir rm '{}' +

我不知道BSD或Solaris是否支持此功能,因此在脚本中使用之前请先进行检查。另外请注意,[[:digit:]]\+测试1个或多个数字,并不仅限于您问题中显示的5个数字。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接