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

时间:2011-07-03 09:48:47

标签: regex linux shell rm

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

我的文件夹中有一些文件,有些文件名包含“好”字样,有些则没有。 例如:

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

我想删除名称中不包含“good”的文件,因此其余文件为:

ssgood.wmv
goodboy.wmv

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

rm -f *[!good].*

但它不起作用。

非常感谢!

3 个答案:

答案 0 :(得分:17)

此命令应该可以满足您的需求:

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

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

答案 1 :(得分:6)

使用bash,您可以通过extglob shell选项获取"negative" matching

shopt -s extglob
rm !(*good*)

答案 2 :(得分: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

再一次,要小心并仔细检查一下你的匹配程度是否超出你想要匹配的次数。