
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
検索出力をディレクトリ名に切り捨て、重複エントリを削除します。最後に、欠落しているファイルを作成しながらフォルダを繰り返します。sort
uniq
cp -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
拡張子が . であるすべてのファイルを見つけるには、.py
OS X シェルで動作する必要があります。
find . *.py -print0 | xargs -0 -I{} cp -r {} /some/dir/name/
メモ:
find -print0
改行文字の代わりにヌル文字で終わるファイルを印刷し、xargs -0
この形式の入力に使用されます。これは、多くの場合、迷惑になる可能性があるスペースやその他のスペースを含むファイル名とパスをより適切に処理するためです。find
OS XはLinux / GNUとは異なるバージョンを使用しているcp
ためこれ例はGNUユーティリティと一緒に使用され、GNUユーティリティを使用する同様の質問に対する多くの例または回答が使用されます。欲しくないOS Xで動作します。