我试图递归循环遍历包含许多其他目录和文件的目录,然后找到所有 .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/ \;