【问题标题】:remove files when name does NOT contain some words当名称不包含某些单词时删除文件
【发布时间】:2011-09-27 13:50:03
【问题描述】:

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

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

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

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

ssgood.wmv
goodboy.wmv

如何在 shell 中使用 rm 来做到这一点?我尝试使用

rm -f *[!good].*

但它不起作用。

非常感谢!

【问题讨论】:

  • 你的意思是“文件名称包含'好'”吗?该示例似乎指示文件名,但您确实说“文件包含单词”...
  • 文件 Names 包含好。我不是以英语为母语的人。感谢 4 提醒。

标签: regex linux shell rm


【解决方案1】:

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

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

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

【讨论】:

  • +1。实际上,grep 是正则表达式驱动的 非常快。
  • 按原样这样做是行不通的,因为ls 命令每行列出多个文件名。您需要像这样添加"-1" "one-file-per-line" 选项:ls -1 | grep ...
  • 嗯...在我的系统上ls 总是每行列出一个文件,所以它工作得很好。奇怪,它可能是某个地方的默认选项。无论如何,我已经添加了 -1 选项,所以它总是可以工作的。
  • @EdoDodo:您的启动文件中可能有一个alias ls='ls -1' 命令。
  • 真的很有用!你是天才!
【解决方案2】:

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

shopt -s extglob
rm !(*good*)

【讨论】:

    【解决方案3】:

    您可以将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
    

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

    【讨论】:

    • 特别好的建议首先使用-print。 :)
    猜你喜欢
    • 2013-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-15
    相关资源
    最近更新 更多