在 BASH shell 中通过管道传输多个命令

在 BASH shell 中通过管道传输多个命令

我试图递归循环遍历包含许多其他目录和文件的目录,然后找到所有 .rb 文件并将它们复制到另一个目录。

这是我目前所拥有的,但它不能正常工作,因为它将当前目录中的所有内容复制到指定目录,而不仅仅是将 .rb(ruby)文件从递归迭代的目录打印到目录中。

这是我正在使用的 BASH 命令:ls -R metasploit-framework-master | grep .rb | cp * gems

此命令metasploit-framework-master是使用命令递归迭代的顶级目录ls -R。 也是gems放置所有 .rb ruby​​ 文件的目录。

第一部分ls -R metasploit-framework-master | grep .rb似乎找到了所有的 ruby​​ 脚本源文件,但最后一部分grep .rb | cp * gems似乎没有将 grep 命令的输出传输到复制命令。

有没有 BASH 专家可以帮帮我?`

答案1

您应该将 find 与 exec 一起使用,请参阅http://en.wikipedia.org/wiki/Find#Execute_an_action。对于你的情况,应该这样做:

find metasploit-framework-master -name '*.rb' -exec cp -av {} gems \;

答案2

这里最容易插入的是xargs. , xargs它允许您stdin在其他命令中将它们用作参数。我会尝试这样的操作:

## This will not work as expected ## 
$ ls -R metasploit-framework-master | grep .rb | xargs -I{} cp {} gems

然而,这实际上不会像你所希望的那样工作:

  • ls -R不会给你完整的路径。
  • grep .rb将匹配多个以 结尾的字符,.rb并且应该进行转义。
  • cp {} gems将不会处理路径中的空格。

更好的方法是使用find

$ find metasploit-framework-master -name '*.rb' | xargs -I{} cp {} gems/

将允许您执行所需的递归枚举。从那里您可以将其通过管道传输到xargs,或者更简洁地使用-exec标志:

$ find metasploit-framework-master -name '*.rb' -exec cp {} gems/ \;

相关内容