我只想做一件简单的事情。我在一个目录中有以下文件:
AppInterface.h baa PEMsg.h PluginInterface.h
然后我发出命令:
ls | grep -v ".h" | rm -rf
令我失望的是,
baa
并没有被删除。但是,这个可以:ls | grep -v ".h"
我期望得到的是baa
,但实际上输出了这个结果。所以我猜测问题出在rm
如何接收输入上,但我不知道原因。在csh和bash中都尝试过。
rm命令无法从stdin接收输入,因此您无法将文件列表管道传输到它。
您需要:
rm `ls | grep -v ".h"`
ls | grep -v ".h" | xargs rm -rf
find . -maxdepth 1 -not -name '*.h' -exec rm -rf {} +
find . -maxdepth 1 -not -name '*.h' -delete
更正确,这可能是真的。 - sorpigalrm
命令不会从标准输入中获取其参数。您可能正在寻找的是命令替换(在此处用反引号表示),其中一个命令的结果可以插入到另一个命令的参数中:
rm -rf `ls | grep -v ".h"`
rm
从哪里输入?为什么要区分呢? - nakiya$( ... )
而不是反引号。 - sorpigal$()
是标准的 POSIX,已经有一段时间了。反引号有时打起来更快,但在需要嵌套引号的行上会导致很多混乱。请参见此处的文档。这绝对不是 bash 独有的。 - sorpigalsh
确实支持这种语法。 - sorpigal