3

我只想做一件简单的事。我在一个目录中得到了以下文件:

AppInterface.h  baa  PEMsg.h  PluginInterface.h

然后我发出命令:

ls | grep -v ".h" | rm -rf

令我沮丧的是,baa没有被删除。但是这个:

ls | grep -v ".h"

正如baa我所料。所以我想问题在于如何rm输入,但我不知道为什么。在 csh 和 bash 中都试过这个。

4

4 回答 4

8

rm 不从标准输入获取输入,因此您无法将文件列表通过管道传输给它。

你需要

 rm `ls | grep -v ".h"`

或者

ls | grep -v ".h" | xargs rm -rf
于 2010-12-06T09:33:01.330 回答
4

你想使用xargs

ls | grep -v ".h" | xargs rm -rf
于 2010-12-06T09:32:01.793 回答
2

rm不从标准输入读取文件列表,这就是它不起作用的原因。您不能将文件名列表通过管道传输到rm.

正确的方法是

find . -maxdepth 1 -not -name '*.h' -exec rm -rf {} +

使用多功能查找实用程序。如果您认为这似乎需要大量工作:这就是正确性的代价。但是,实际上,一旦您熟悉了 find,情况并不会更糟。

于 2010-12-06T12:49:55.760 回答
1

rm不从标准输入中获取其参数。您可能正在寻找的是命令替换(由此处的反引号表示),其中一个命令的结果可以插入到另一个命令的参数中:

 rm -rf `ls | grep -v ".h"`
于 2010-12-06T09:32:23.310 回答