gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 12:36:06 27 4
gpt4 key购买 nike

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

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

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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com