8

我正在使用 Linux 并打算使用 shell 删除一些文件。

我的文件夹中有一些文件,一些文件名包含“好”这个词,而另一些则没有。例如:

ssgood.wmv
ssbad.wmv
goodboy.wmv
cuteboy.wmv

我想删除名称中不包含“good”的文件,所以剩下的文件是:

ssgood.wmv
goodboy.wmv

如何rm在 shell 中使用?我尝试使用

rm -f *[!good].*

但它不起作用。

非常感谢!

4

3 回答 3

21

这个命令应该做你需要的:

ls -1 | grep -v 'good' | xargs rm -f

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

于 2011-07-03T09:55:47.023 回答
6

使用 bash,您可以通过shell 选项获得“否定”匹配:extglob

shopt -s extglob
rm !(*good*)
于 2011-07-03T11:53:23.830 回答
4

您可以find-not运算符一起使用:

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

我曾经-exec在那里打电话rm,但我想知道它是否find有内置的删除操作 ,见下文

但对此非常小心。请注意,在上面我必须放入一个-a -not -name "."子句,否则它匹配.当前目录。所以我会-print在投入之前彻底测试-exec rm {} \;

更新:是的,我从未使用过它,但确实有一个-delete动作。所以:

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

同样,要小心并仔细检查您匹配的次数没有超过您想要匹配的次数。

于 2011-07-03T09:54:36.650 回答