特定の拡張子を持つファイルを見つけて、別のハードドライブ/ディレクトリにコピーまたは再同期しようとしています。
sudo find . \( -type f \( -iname '*.jpg' -o -iname "*png" -o -iname "*mov" -o -iname "*mp3" -o -iname "*mp4" -o -iname "*swf" -o -iname "*avi" \) -exec rsync {} ~/test/dest/ \; \)
シェル出力は次のとおりです。
cp: './dest/DSC_0085.JPG' and '/home/sanz/test/dest/DSC_0085.JPG' are the same file
cp: './dest/DSC_0086.avi' and '/home/sanz/test/dest/DSC_0086.avi' are the same file
など...
コピーしているファイルとコピーする場所が異なるディレクトリにあるにもかかわらず、同じファイルであることを伝え続けるのはなぜですか?これは言葉ではありません。
また、コマンドのさまざまなバリエーションを試していますが、必要に応じて機能しません。
sudo find . -type f -iname '*.jpg' -o -name "*png" -o -name "*mov" -o -name "*mp3" -o -name "*mp4" -o -name "*swf" -o -name "*avi" -exec rsync -ah --progress {} ~/test/dest \;
aviファイルのみをコピーし、他のファイルは完全に無視します。私にとって奇妙なことは、-execを持たない同じコマンドは通常、特にタグ付けされたすべてのファイルを出力しますが、コピーコマンドで使用するにはaviファイルのみを読み取るかコピーすることです。
答え1
コマンドを実行すると、 で識別されたサブディレクトリを/home/sanz/test
含む、ファイルのどこにでも指定された名前のファイルを探します。dest
これは同じディレクトリなので、実際にはディレクトリとファイルを自分自身にコピーしようとしています。find
./dest
~/test/dest/
/home/sanz/test/dest/
/home/sanz/test
その中にあるファイルを見つけてコピーするには、除外オプションを使用する必要が~/test/dest
あります。-prune
/home/sanz/test/dest
sudo find . -path ./dest -prune -o \( -type f \( -iname '*.jpg' -o -iname "*png" -o -iname "*mov" -o -iname "*mp3" -o -iname "*mp4" -o -iname "*swf" -o -iname "*avi" \) -exec rsync {} ~/test/dest/ \; \)
答え2
ディレクトリからそのディレクトリのサブディレクトリにファイルをコピーすると、Freddyが言ったように同じディレクトリに同じファイルをコピーしたのと同じです。そこで、他の場所にディレクトリを作成し、キーボードをタップしてから、次のコードを生成しました。
sudo find ~/test/ \( -type f \( -iname '*.jpg' -o -iname "*png" -o -iname "*mov" -o -iname "*mp3" -o -iname "*mp4" -o -iname "*swf" -o -iname "*avi" \) -exec rsync {} ~/dest/ \; \)
とても魅力的です。私はこれらの技術的な用語についてはよくわかりませんが、あなたが私を理解してほしいと思います。