多数の他のディレクトリとファイルを含むディレクトリを再帰的にループし、すべての .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 コマンドの出力を 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/ \;