BASH シェルで複数のコマンドをパイプする

BASH シェルで複数のコマンドをパイプする

多数の他のディレクトリとファイルを含むディレクトリを再帰的にループし、すべての .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 * gemsgrep コマンドの出力を copy コマンドにパイプしていないようです。

BASH の専門家の皆さん、助けていただけませんか? `

答え1

execでfindを使う必要があります。http://en.wikipedia.org/wiki/Find#アクションの実行あなたの場合は、これで解決するはずです:

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/ \;

関連情報