为什么不像我期望的那样工作?

nak*_*iya 3 regex bash csh

我只是想做一件简单的事情.我在目录中获得了以下文件:

AppInterface.h  baa  PEMsg.h  PluginInterface.h
Run Code Online (Sandbox Code Playgroud)

然后我发出命令:

ls | grep -v ".h" | rm -rf
Run Code Online (Sandbox Code Playgroud)

令我沮丧的是,baa不会被删除.但是这个:

ls | grep -v ".h"
Run Code Online (Sandbox Code Playgroud)

baa按照我的预期给出.所以我猜问题是如何rm输入,但我不知道为什么.在csh和bash中试过这个.

The*_*aul 8

rm不从stdin获取输入,因此您无法将文件列表传递给它.

你需要

 rm `ls | grep -v ".h"`
Run Code Online (Sandbox Code Playgroud)

要么

ls | grep -v ".h" | xargs rm -rf
Run Code Online (Sandbox Code Playgroud)

  • Rm仅从命令行中删除要删除的文件列表.反引号``版本执行ls和grep,并将命令行的输出替换为rm.xargs确实从stdin获取其输入,并使用输入作为命令行参数调用命令(在本例中为rm -rf).当有大量输入需要处理时,xargs会更好,或者在输入传递给命令之前需要对输入进行复杂处理. (2认同)
  • 使用`$()`是标准POSIX并且已经有一段时间了.有时,反引号的输入速度更快,但在需要嵌套引号的行上导致大量混乱.有关文档,请参见[此处](http://www.opengroup.org/onlinepubs/009695399/utilities/xcu_chap02.html#tag_02_06_03).它当然不是bash独有的. (2认同)