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在解释它时会在空格处分开。以这种方式将文件名列表放入标量 shell 变量中是很危险的。
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 所建议的那样。
| 归档时间: |
|
| 查看次数: |
42229 次 |
| 最近记录: |