流水线和 xargs

流水线和 xargs

我正在尝试从目录中删除一些 .文件。因此,我首先尝试使用以下命令(进入目录后)class计算可用文件的数量-.class

$ find . -name *.class | wc -l   

在这里我可以理解流水线 (|) 的作用 - 命令/进程的输出find作为命令的输入wc(如果我错了,请纠正我)。上面的命令对我来说很好用,并产生了正确的输出。但是当我尝试使用class以下命令删除所有 . 文件时,使用流水线 -

$ find . -name *.class | rm *  # case-1

那么它就不起作用了。它显示以下错误 -

rm: cannot remove `<a_directory_name>': Is a directory
rm: cannot remove `<an_another_directory_name>': Is a directory  

但当我使用它xargs时它工作正常 -

$ find . -name *.class | xargs rm *  # case-2

现在我的问题是谁能告诉我为什么case-1工作正常但是却不工作case-2

提前致谢。

答案1

Case-1 不起作用的原因是它rm不通过 STDIN 获取参数,而是获取要删除的参数或文件,如下所示:

rm file_1 file_2

而在 Case-2 中,通过 STDINxargs获取命令的输出find,并将文件名转换为rm命令的参数。

请阅读man rmman xargs以获得关于此问题的更多想法。

相关内容