Linux 为什么我不能通过管道找到结果到 rm?

标签 linux bash find pipe rm

对不起,如果这是一个菜鸟问题,但我找不到好的答案。

找到然后删除我可以使用的东西

find . -name ".txt" -exec rm "{}" \;

但是为什么我不能像管道一样将结果传递给 rm

find . -name ".txt" | rm 

就像我将它通过管道传递给 grep

find . -name ".txt" | grep a

我从某处读到 rm 不接受来自标准输入的输入,因此我无法通过管道传输它,但这是什么意思?当我输入 rm a.txt 时,它从标准输入中读取,就像我可以 grep 一样,对吗?还是标准输入和命令行之间有区别。救命!

最佳答案

扩展@Alex Gitelman 的回答:是的,“标准输入”和命令行之间是有区别的。

当您键入 rm a.txt b.txt c.txt 时,您在 rm 之后列出的文件称为 arguments,并且是通过一个特殊变量(内部称为 argv)提供给 rm。另一方面,标准输入看起来像一个名为 stdin 的文件的 Unix 程序。程序可以从这个"file"中读取数据,就像它在磁盘上打开一个常规文件并从中读取一样。

rm 与许多其他程序一样,从命令行获取参数,但忽略标准输入。你可以通过管道传输任何你喜欢的东西;它只会丢弃这些数据。这就是 xargs 派上用场的地方。它读取标准输入上的行并将它们转换为命令行参数,因此您可以有效地将数据通过管道传输到另一个程序的命令行。这是一个巧妙的技巧。

例如:

find . -name ".txt" | xargs rm
find . -name ".txt" | grep "foo" | xargs rm  

请注意,如果有任何文件名包含换行符或空格,这将无法正常工作。 要处理包含换行符或空格的文件名,您应该改用:

find . -name ".txt" -print0 | xargs -0 rm

这将告诉 find 以空字符而不是换行符终止结果。 但是,grep 不会像以前那样工作。而是使用这个:

find . -name ".txt" | grep "foo" | tr "\n" "\0" | xargs -0 rm

这一次 tr 用于将所有换行符转换为空字符。

关于Linux 为什么我不能通过管道找到结果到 rm?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20307299/

相关文章:

cakephp 查找所有条件 AND OR

linux - 我应该在 Rust 中的什么地方保存我的配置文件

linux - 如何重定向带括号的 URL

linux - 页面分配失败时的顺序和模式

xml - 使用 xmlstarlet 编辑 XML 中的值

jquery - 使用 jQuery 访问列表项的文本

linux - 需要将 azure VM OS 磁盘大小从 32 GB 调整为 16 GB

python - 如何在 python 脚本内的子进程中使用 * ?

bash - 将输入传递给 bash 脚本中的多个命令

regex - linux查找正则表达式