在 Linux 上,如何找到所有包含字符串的文件并删除它们?

Kit*_*sos 18 linux bash command-line find

我想删除所有包含字符串的文件foo。如何在 Linux 中使用 bash 执行此操作?

Lek*_*eyn 35

这是一个安全的方法:

grep -lrIZ foo . | xargs -0 rm -f --
Run Code Online (Sandbox Code Playgroud)
  • -l 打印与搜索模式匹配的文件的文件名。
  • -rfoo对给定目录中的模式执行递归搜索.。如果这不起作用,请尝试-R
  • -I(capital i) 会导致跳过像 PDF 这样的二进制文件。
  • -Z 确保文件名以零(即空)终止,以便包含空格的名称不会被以错误的方式解释(即,作为多个名称而不是一个)。
  • xargs -0将文件名从grepto 提供rm -f,用零 (nul) 字节分隔单词(请记住-Zfrom的选项grep)。
  • --经常被遗忘,但标记选项的结尾并允许删除名称以-.

如果你想看到哪些文件要被删除,只需取下| xargs -0 rm -f --一部分,并留下关闭的Z选项grep

另一位用户建议了类似以下内容,您不应运行它,因为它不安全:

files=`grep foo * | cut -d: -f1`
rm -f $files         # unsafe, do not run it!
Run Code Online (Sandbox Code Playgroud)

如果我有ImportantStuff我不想删除和obsolete ImportantStuff包含的文件foo,那么当我运行这个命令时我会丢失ImportantStuff(而不是 obsolete ImportantStuff!),因为$files在解释它时会在空格处分开。以这种方式将文件名列表放入标量 s​​hell 变量中是很危险的。


Adr*_*rth 17

$ find -type f -exec grep -q "foo" {} \; -exec echo rm -- {} \;
Run Code Online (Sandbox Code Playgroud)

这将递归搜索包含foo. 第二个-exec仅在第一个exec成功退出时运行,即如果grep匹配。echo如果输出看起来正确,请试运行并删除。

或者替代地

$ find -type f -exec grep -q "foo" {} \; -print
Run Code Online (Sandbox Code Playgroud)

$ find -type f -exec grep -q "foo" {} \; -delete
Run Code Online (Sandbox Code Playgroud)

正如 Lekensteyn 所建议的那样。

  • ...可以缩写为:`find -type f -exec grep -q 'foo' {} \; -delete`(`{}` 周围的引号是多余的,`find` 也可以删除文件。)。请注意,`grep` 接受正则表达式。如果你想搜索 `foo.bar`,要么转义它,要么传递 `-F` 选项以将模式视为文字。 (4认同)