对不起,如果这是一个菜鸟问题,但我找不到好的答案。
找到然后删除我可以使用的东西
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/