【问题标题】:Delete files containing "some text" in folder with many files (100k+)删除包含许多文件的文件夹中包含“某些文本”的文件(100k+)
【发布时间】:2016-02-23 14:19:02
【问题描述】:

我正在尝试删除我们的系统为搜索机器人创建的会话文件。上次行得通,这次不行,我猜是因为会话文件的数量增加了。

我使用的是grep -l 'spider' * | xargs rm

但现在我收到来自grepArgument list too long 错误。

有什么方法可以使用findgreprm 来完成此任务?

编辑:

所有文件中都没有空格。

我在想,由于grep 无法处理文件数量,我可能会使用find 来管理大量文件,因为我认为(可能是错误的)findexec {} 会自动将文件分成可管理的块。但也许这行不通。

不过,无论如何,我真的需要删除这些文件!

编辑:

我无法解决这个问题,真的。我删除了旧文件,直到文件数量足够小,我可以运行它:

grep -l "spider" * | xargs rm

然后我设置了一个 cron 来每隔几分钟运行一次命令。我现在能够延长会话生命周期,因为 cron 的频率意味着运行 rm 命令的文件更少。

【问题讨论】:

  • 抱怨参数数量的不是rm吗?
  • 您要删除的文件是否有任何共同的文件名模式?有什么办法可以避免查看每个文件的内容?
  • @aguibert 目前没有模式。文件名是会话哈希。没有办法从机器人中分辨出人类会话哈希。但也许将来我可以更改会话创建代码并专门命名机器人会话文件。

标签: grep find exec rm


【解决方案1】:

您可以使用-n N 限制xargs 传递给其命令的参数数量,其中N 是参数数量。

您可以尝试不同的 N 值。

xargs -n 500 rm

您还可以查看以下是否适用于您的系统以确定限制。

xargs --show-limits

如果你需要用 grep 查看文件名,你可以链接命令

find . -type f | xargs -n 500 grep -l "spider" | xargs -n 500 ...

另一种避免命令行限制的删除文件的方法(不过,在这种情况下不起作用,因为过滤器在文件中,而不是文件名中)。

find * -name "some file name pattern" -exec rm {} +

【讨论】:

  • 我尝试了-n 50000-n 5000,但 grep 仍然在抱怨。我很确定它上次处理的次数远远超过 5000 个。
  • 另请注意,您的find 将无法工作,因为它正在寻找文件名。我需要删除包含文本“蜘蛛”的文件。
  • find 命令执行其他操作。它检查文件名,而不是文件内容。
  • @Kent 是的,我需要删除包含单词“spider”的文件,无论它们的名称如何。
  • @JRD 你是否建议我一次 grep 500 个文件,直到我完成所有 109,000 个文件?好像打字很多。
【解决方案2】:

另一个想法是构建rm xxx 语句和管道到sh

grep -l 'spider' * |sed 's/^/rm /'|sh

您可以先删除|sh 以检查命令是否正常。此外,如果文件名中有空格,则可能需要通过扩展 sed 来引用名称。

【讨论】:

  • 这仍然不起作用。问题的基础是 grep 被* 负担过重。 -bash: /bin/grep: Argument list too long
猜你喜欢
  • 2015-09-14
  • 1970-01-01
  • 2011-01-15
  • 2012-07-24
  • 2017-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多