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

最容易到達這裡的是xargsxargs允許您將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/ \;

相關內容