我試圖遞歸地循環遍歷包含許多其他目錄和檔案的目錄,然後找到所有 .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
不僅會匹配以 and 結尾的內容.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/ \;