Answers:
这是一种安全的方法:
grep -lrIZ foo . | xargs -0 rm -f --
-l 打印与搜索模式匹配的文件的文件名。-rfoo对给定目录中的模式执行递归搜索.。如果这不起作用,请尝试-R。-I(大写i)会导致二进制文件(如PDF)被跳过。-Z 确保文件名以零(即nul)结尾,以便包含空格的名称不会被错误地解释(即,多个名称而不是一个)。xargs -0将文件名从grep传送到rm -f,以零(nul)个字节分隔单词(请记住-Z来自的选项grep)。--通常会被忘记,但是标记选项的结束并允许删除名称开头的文件非常重要-。如果您想查看要删除的文件,只需删除该| xargs -0 rm -f --部分,然后将Z选项保留为grep。
另一个用户建议类似以下内容,由于它不安全,因此不应运行:
files=`grep foo * | cut -d: -f1`
rm -f $files # unsafe, do not run it!
如果我有ImportantStuff不想删除和obsolete ImportantStuff包含的文件foo,则在运行此命令时会丢失ImportantStuff(而不是 obsolete ImportantStuff!),因为$files在解释该命令时,它们在空格处会分开。以这种方式将文件名列表放入标量shell变量中是危险的。
$ find -type f -exec grep -q "foo" {} \; -exec echo rm -- {} \;
这将以递归方式搜索包含的文件foo。-exec仅当第一个exec成功退出(即grep匹配)时,才运行第二个。echo如果输出看起来正确,请进行Dryrun并删除。
或者
$ find -type f -exec grep -q "foo" {} \; -print
和
$ find -type f -exec grep -q "foo" {} \; -delete
如Lekensteyn所建议。
find -type f -exec grep -q 'foo' {} \; -delete引号{}是多余的,find也可以删除文件。)。请注意,它grep接受正则表达式。如果要搜索foo.bar,请对此进行转义或传递-F选项以将模式视为文字。
-exec echo rm "{}" \;没有使用的理由-delete吗?
-delete。使用第二个-exec和适当的echo 演示起来更容易。
-print(或-ls更详细)比容易-exec echo rm "{}" \'。无需外部实用程序。