Answers:
这是一种安全的方法:
grep -lrIZ foo . | xargs -0 rm -f --
-l
打印与搜索模式匹配的文件的文件名。-r
foo
对给定目录中的模式执行递归搜索.
。如果这不起作用,请尝试-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 "{}" \'
。无需外部实用程序。