当文件名不包含某些单词时删除文件

8
我是一名使用Linux系统的用户,打算使用shell命令删除一些文件。
我的文件夹中有一些文件,其中一些文件名包含单词“good”,而其他文件则不包含。 例如:
ssgood.wmv
ssbad.wmv
goodboy.wmv
cuteboy.wmv

我希望删除文件名中不包含“good”字样的文件,以便剩下的文件为:

ssgood.wmv
goodboy.wmv

如何在shell中使用rm进行操作?我尝试使用
rm -f *[!good].*

但是它并没有起作用。
非常感谢!

2
你的意思是“文件名包含'good'”吗?示例似乎表明是文件名,但你确实说“文件包含该单词”... - sarnold
文件Names很好。我不是英语母语者。感谢提醒。 - DocWiki
3个回答

23
这个命令应该可以满足你的需求:
ls -1 | grep -v 'good' | xargs rm -f

它可能比其他命令运行得更快,因为它不涉及使用正则表达式(正则表达式速度慢,对于这样简单的操作是不必要的)。


1
+1. 实际上,grep 既支持正则表达式,又非常快速。 - Alan Moore
3
原文:As-is this won't work because the ls command lists multiple filenames per line. You need to add the "-1" "one-file-per-line" option like so: ls -1 | grep ...翻译:原来的命令行无法正常运行,因为ls 命令会在一行中列出多个文件名。你需要添加"-1"参数,即_"每行一个文件"_选项,命令如下:ls -1 | grep ... - ridgerunner
1
@EdoDodo:你可能在启动文件中有一个alias ls='ls -1'命令。 - ridgerunner
1
非常有用!你真是个天才! - Christian Vielma
对我来说不起作用,不知道为什么它试图删除“(标准输入)” - Rodrigo Farias Rezino
显示剩余3条评论

6

使用bash,您可以通过extglob shell选项进行"负向"匹配

shopt -s extglob
rm !(*good*)

5

您可以使用 find 命令并搭配 -not 操作符:

find . -not -iname "*good*" -a -not -name "." -exec rm {} \;

我使用了-exec调用了rm,但是我想知道find是否有内置的删除操作 它有,见下文

但是要非常小心。请注意,在上面的例子中,我不得不加入-a -not -name "."语句,因为否则它会匹配到当前目录.。所以在加入-exec rm {} \;之前,请先仔细测试-print

更新:没错,我从未使用过它,但确实有一个-delete操作。所以:

find . -not -iname "*good*" -a -not -name "." -delete

再次提醒,一定要小心并仔细检查您匹配的内容是否超出了您想要匹配的范围。


2
特别好的建议是先使用-print。 :) - sarnold

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