私はすべてをコピーしたい場合*.so
からファイルをsrc
にdst
私は思います。
cp src/*.so dst
ただし、*.so
srcからすべてのファイルをコピーし、そのサブディレクトリをにコピーしたいと思いますdst
。手がかりはありますか?
私はすべてをコピーしたい場合*.so
からファイルをsrc
にdst
私は思います。
cp src/*.so dst
ただし、*.so
srcからすべてのファイルをコピーし、そのサブディレクトリをにコピーしたいと思います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/ ';'