Linux:パターンに一致するすべてのファイルをdirおよびsubdirsから単一のdirにコピーします


31

私はすべてをコピーしたい場合*.soからファイルをsrcdst私は思います。

cp src/*.so dst

ただし、*.sosrcからすべてのファイルをコピーし、そのサブディレクトリをにコピーしたいと思いますdst。手がかりはありますか?

回答:


36

試してください:

find src/ -type f | grep -i so$ | xargs -i cp {} dst

17
findパターンマッチングを実行し、コマンドを実行できます。出力をパイプする必要はありません:find src/ -type f -name '*.so' -exec cp '{}' dst/ ';'
11

1
はい、できますが、多くの場合、パイプラインを読む方が簡単です。またgrep-nameパラメータで使用される単純なシェルパターンをはるかに上回るパターンマッチング機能がありますfindxargs-execパラメータよりもはるかに強力ですfind
マイクInsch

2
MacOSXではxargsユーティリティに-iオプションがないため、@ jaquerのソリューションははるかに優れています。しかし、彼のソリューションは魅力のように機能します。
bialix

私はMacで完璧に動作したjaquerのソリューションに関する@bialixからのコメントを読むまで、xargsの-i引数に関するエラーメッセージに苦労していました。ありがとう
svannoy

これにより、必要に応じてサブディレクトリが作成されますか?
レナート・ローランド

15

Bashを使用している場合、globstar シェルオプションをオンにして、ファイルとディレクトリを再帰的に一致させることができます。

shopt -s globstar
cp src/**/*.so dst

名前がで始まる.ファイルや、名前がで始まるディレクトリ内およびその下のファイルを検索する必要がある場合は.dotglobオプションも設定します(たとえば、shopt -s dotglob)。両方を1つのコマンドで設定できます。

shopt -s globstar dotglob

で始まるサブディレクトリ内のファイルをコピーしません。その名前で
rboy

8

マイクが提案したコマンドを試しました:

find src/ -type f | grep -i so$ | xargs -i cp {} dst

しかし、すべてのファイルがディレクトリにダンプされdst、相対パスが失われました。

相対パスを保持するには、コマンドを次のように変更する必要があります。

find src/ -type f | grep -i so$ | xargs -i cp {} dst/{}

7
+1。ただし、これは、相対ソースパスに対応するディレクトリがの下に存在することを前提としていますdst。そうでない場合は、を使用してくださいcp --parents。また、ファイル名を引用符で囲んでください。したがって:(... | xargs -i cp --parents "{}" dstへの最後の引数cpは現在、「ちょうど」宛先ディレクトリであることに注意してください)。-tフラグを使用して、コマンドをさらに短くすることができます(おそらくより高速にできます)... | xargs cp --parents -t dst
ステファン202

1
Stephan202 @私が使用していた... | xargs cp {} --parents -t dst.
warvariuc

Macの場合--parentsは利用できません。ditto代わりに使用しました:stackoverflow.com/questions/11246070/cp-parents-option-on-mac
Bryan Young

3

これを行う別の方法は次のとおりです。

find src/ -type f -name "*.so" -exec cp {} dst/ \;

これにより、cpプロセスの数が減ります... -exec cp -t dst/ {} +
カミル・マチオロフスキ

やあカミル!コメントありがとうございます!あなたのソリューションが物事をより速くする方法を私に説明してください!常にもっと学ぶことをいとわない:)
Kyriakos

で終わる-exec;{}一度に1つのパスに置き換えられます。cpファイルごとに個別に取得します。+構文のfind置き換え{}複数の結果と(コマンドラインの長さのシステム定義の限界まで;制限:{}前の最後のものでなければならない+ため、cp -t)。プロセスの作成と終了は比較的コストのかかるものです。このため、+多くの結果が期待される場合はいつでも使用するのが適切です。この場合、とにかく大量のファイルをコピーするのに時間がかかるので、違いは気付かれずに通過します。それにもかかわらず、それは良い習慣です。
カミルマシオロウスキ

1

grepは、find-nameを使用して置き換えることができます。

find src/ -type f -name "*.so" | xargs -i cp {} dst/{}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.