特定の拡張子を持つファイルを含むすべてのフォルダをコピーします。

特定の拡張子を持つファイルを含むすべてのフォルダをコピーします。

Mac端末で、指定された拡張子を持つ1つ以上のファイルを含むすべてのディレクトリを見つけて別の場所にコピーしたいと思います。ファイルを含むすべてのディレクトリをfind . -iname '*.jpg' -exec dirname {} \;探しているようですが、*.jpgファイルをコピーする方法がわかりません。使ってみましたが、rsyncうまくいきませんでした。最良のアプローチは何ですか?

答え1

これはbash、ディレクトリ構造を維持しながらjpgを含むすべてのフォルダをバックアップと呼ばれるフォルダにコピーするフレンドリーな行です。

mkdir backup; for folder in $(find . -type f -name '*.jpg' | sed -r 's|/[^/]+$||' |sort |uniq); do cp -r --parents $folder backup; done

まず空のフォルダを作成し、次のbackupコマンドfindは 。で始まるファイルを検索し、.jpgコマンドはsed検索出力をディレクトリ名に切り捨て、重複エントリを削除します。最後に、欠落しているファイルを作成しながらフォルダを繰り返します。sortuniqcp -r --parents

このようなフラグをsed -r使用して-printfバイパスすることができます。find

mkdir backup; for folder in $(find . -type f -name '*.jpg' -printf "%h\n" |sort |uniq); do cp -r --parents $folder backup; done

findサポートしていない場合はお試し-printfください。grep

mkdir backup; for folder in $(find . -type f -name '*.jpg' | grep -o "\(.*\)/" |sort |uniq); do cp -r --parents $folder backup; done

答え2

拡張子が . であるすべてのファイルを見つけるには、.pyOS X シェルで動作する必要があります。

find . *.py -print0 | xargs -0 -I{} cp -r {} /some/dir/name/

メモ:

  • find -print0改行文字の代わりにヌル文字で終わるファイルを印刷し、xargs -0この形式の入力に使用されます。これは、多くの場合、迷惑になる可能性があるスペースやその他のスペースを含むファイル名とパスをより適切に処理するためです。
  • findOS XはLinux / GNUとは異なるバージョンを使用しているcpためこれ例はGNUユーティリティと一緒に使用され、GNUユーティリティを使用する同様の質問に対する多くの例または回答が使用されます。欲しくないOS Xで動作します。

関連情報