私はすべてをコピーしたい場合*.soからファイルをsrcにdst私は思います。
cp src/*.so dst
ただし、*.sosrcからすべてのファイルをコピーし、そのサブディレクトリをにコピーしたいと思いますdst。手がかりはありますか?
私はすべてをコピーしたい場合*.soからファイルをsrcにdst私は思います。
cp src/*.so dst
ただし、*.sosrcからすべてのファイルをコピーし、そのサブディレクトリをにコピーしたいと思いますdst。手がかりはありますか?
回答:
試してください:
find src/ -type f | grep -i so$ | xargs -i cp {} dst
grep、-nameパラメータで使用される単純なシェルパターンをはるかに上回るパターンマッチング機能がありますfind。 xargsの-execパラメータよりもはるかに強力ですfind。
マイクが提案したコマンドを試しました:
find src/ -type f | grep -i so$ | xargs -i cp {} dst
しかし、すべてのファイルがディレクトリにダンプされdst、相対パスが失われました。
相対パスを保持するには、コマンドを次のように変更する必要があります。
find src/ -type f | grep -i so$ | xargs -i cp {} dst/{}
dst。そうでない場合は、を使用してくださいcp --parents。また、ファイル名を引用符で囲んでください。したがって:(... | xargs -i cp --parents "{}" dstへの最後の引数cpは現在、「ちょうど」宛先ディレクトリであることに注意してください)。-tフラグを使用して、コマンドをさらに短くすることができます(おそらくより高速にできます)... | xargs cp --parents -t dst。
... | xargs cp {} --parents -t dst.
--parentsは利用できません。ditto代わりに使用しました:stackoverflow.com/questions/11246070/cp-parents-option-on-mac
これを行う別の方法は次のとおりです。
find src/ -type f -name "*.so" -exec cp {} dst/ \;
cpプロセスの数が減ります... -exec cp -t dst/ {} +。
-execと;、{}一度に1つのパスに置き換えられます。cpファイルごとに個別に取得します。+構文のfind置き換え{}複数の結果と(コマンドラインの長さのシステム定義の限界まで;制限:{}前の最後のものでなければならない+ため、cp -t)。プロセスの作成と終了は比較的コストのかかるものです。このため、+多くの結果が期待される場合はいつでも使用するのが適切です。この場合、とにかく大量のファイルをコピーするのに時間がかかるので、違いは気付かれずに通過します。それにもかかわらず、それは良い習慣です。
findパターンマッチングを実行し、コマンドを実行できます。出力をパイプする必要はありません:find src/ -type f -name '*.so' -exec cp '{}' dst/ ';'