重複ファイルを見つけて、あるコピーを別のドライブに移動し、他のすべてのコピーを削除します。

重複ファイルを見つけて、あるコピーを別のドライブに移動し、他のすべてのコピーを削除します。

実際、私は2つの異なることをしようとしています。

1つ目は、重複した項目を除いて、すべてのビデオファイル、写真、文書を旅行用ハードドライブにコピーすることでした。したがって、旅行用ハードドライブにはコピーが1つしかありません。複数レベルのフォルダ(ntfsファイルシステム)を表示できるはずです。 2つ目は、ソースファイルのコピーをソースに、コピーを旅行用ドライブに残し、ソースから重複したファイルをすべて削除しながら、これらすべてのファイルのコピーを転送することです。これは2つの異なるシステムのためであるため、2つの同様の要求が

特定のファイル形式(エンコード比較または.xyz拡張子を介して)に制限し、ファイルがハッシュされて重複がないかどうかを確認したいと思います。

私のニーズは、冗長ファイル検索機能と他のメディアへの自動転送/コピーを組み合わせることです...好ましくは1つのステップで。

そのようなツールがありますか?または、コマンドラインを使用してこれをどのように実行しますか?

答え1

fdupes1つのアイデアはとの組み合わせを使用することですrsync

  1. 転送を検討しているすべてのファイルの準備領域を作成するために使用されますrsync
  2. 準備領域の項目を除くすべての重複項目を削除します(のみ)。
  3. もう一度使用してください。ステージングの残りのファイルをターゲットに転送しますrsync

これには3つの場所が必要です。

  1. 元のファイル、ディレクトリパスは$origdir
  2. ストレージキャッシュ、$stagingdir
  3. target、のローカルまたはリモートパス$destdir

まず、準備領域を作成します(これは、準備領域がまだ存在しない場合、または存在する場合は転送する必要がある項目のみを含むと仮定します)。

rsync --archive --verbose --link-dest="$origdir" \
    --include="*.jpg" --include="*/" --exclude="*" \
    "$origdir/" "$stagingdir"

.jpgこれにより、元の場所からハードリンクが作成され、名前で終わるすべてのファイルがステージング領域にコピーされます。ディレクトリ構造を作成するにはスペースのみが必要で、ファイルデータは重複しません($stagingdirおよび$origdir2つの異なるパーティションにない限り)。追加のファイル名パターンを追加するには、より多くの--includeオプション(今後これ--exclude)。

次に、fdupes次を実行します$stagingdir

fdupes --delete --recurse "$stagingdir"

削除する前にインタラクティブに確認をリクエストしてください。--noprompt確認なしでファイルを削除するオプションもあります。fdupesマニュアルをお読みください注意深い$origdir準備領域からファイルを削除しても、以下のファイルには影響しません。

次に、準備ディレクトリから空のディレクトリを削除します(これは追加の手順で、わずかにクリーンアップします)。

find "$stagingdir" -type d -empty -delete -print

これにより、ステージング領域全体を移動し、空のディレクトリがすべて削除されます。正常に削除されると、削除されたすべてのディレクトリが印刷されます。

最後に重複していない項目を転送します。

rsync --archive --verbose "$stagingdir/" "$destdir"

このプロセスは、最初のプロセスで使用されたパターンと一致するファイルの元のディレクトリ構造を保存し、重複エントリが削除されたrsync後もそのまま残ります。fdupes

関連情報