我只想做一件简单的事情。我在目录中获得了以下文件:
AppInterface.h baa PEMsg.h PluginInterface.h
然后我发出命令:
ls | grep -v ".h" | rm -rf
令我沮丧的是,baa
没有被删除。但是,这个:
ls | grep -v ".h"
按照我的预期给出baa
。所以我想问题是rm
如何接受输入,但我不知道为什么。在csh和bash中试过这个。
答案 0 :(得分:8)
rm不从stdin获取输入,因此您无法将文件列表传送给它。
你需要
rm `ls | grep -v ".h"`
或
ls | grep -v ".h" | xargs rm -rf
答案 1 :(得分:4)
您想使用xargs:
ls | grep -v ".h" | xargs rm -rf
答案 2 :(得分:2)
rm
没有从stdin中读取文件列表,这就是它无法正常工作的原因。您无法将文件名列表传递给rm
。
正确的方法是
find . -maxdepth 1 -not -name '*.h' -exec rm -rf {} +
使用多功能find实用程序。如果你认为这似乎很多工作:那就是正确的代价。但是,真的,一旦你熟悉了find,它就不会变得更糟。
答案 3 :(得分:1)
rm
不接受标准输入的参数。你可能正在寻找的是命令替换(这里用反引号表示),其中一个命令的结果可以插入到另一个命令的参数中:
rm -rf `ls | grep -v ".h"`