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

Doc*_*iki 7 regex linux shell rm

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

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

ssgood.wmv
ssbad.wmv
goodboy.wmv
cuteboy.wmv
Run Code Online (Sandbox Code Playgroud)

我想删除名称中不包含"good"的文件,因此剩下的文件是:

ssgood.wmv
goodboy.wmv
Run Code Online (Sandbox Code Playgroud)

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

rm -f *[!good].*
Run Code Online (Sandbox Code Playgroud)

但它不起作用.

非常感谢!

Edo*_*odo 17

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

ls -1 | grep -v 'good' | xargs rm -f
Run Code Online (Sandbox Code Playgroud)

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

  • 因为`ls`命令每行列出多个文件名,所以这不起作用.你需要添加`"-1"`_"one-file-per-line"_选项,如下所示:`ls -1 | grep ......` (2认同)

gle*_*man 6

使用bash,您可以通过shell选项获得"负面"匹配extglob:

shopt -s extglob
rm !(*good*)
Run Code Online (Sandbox Code Playgroud)


T.J*_*der 5

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

find . -not -iname "*good*" -a -not -name "." -exec rm {} \;
Run Code Online (Sandbox Code Playgroud)

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

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

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

find . -not -iname "*good*" -a -not -name "." -delete
Run Code Online (Sandbox Code Playgroud)

再次强调,要小心并仔细检查您匹配的内容是否超出了您首先想要匹配的内容。

  • 特别好的建议是首先使用“-print”。:) (2认同)