コンテンツ全体が別の場所にあることがわかっているので、(迅速な手動確認が必要な場合でも)削除しても安全であることを知っているディレクトリに関するレポートを生成したいと思います。特に、重複ファイルがボリューム内の他の場所、まったく異なるディレクトリレイアウト、および関連ディレクトリに存在しないファイルの間にランダムに散在している場合も同様です。
つまり、ディレクトリ構造と内容は同じではありません。ただし、100%含まれているファイルは、同じFS上の任意の場所に別々にコピーされます。
以下のワークフローとユースケースを見ると、これがほぼ常に一方向の関係であることが明らかになります。 dir1のファイルの内容は、100%異なるファイル名とディレクトリ構造で他の場所に存在する可能性があり、多くの場合、各ファイルの複数のコピーがある可能性があります。
たとえば、dir1/file1 のコピーが dir2 および dir3 に存在します。 dir1/file2 のコピーが dir2 および dir4 にある場合があります。 dir2、dir3、および/またはdir4には、固有のファイルだけでなく、他のディレクトリにあるファイルのコピーも含めることができます。しかし、dir1は削除しても安全です。
つまり、逆相関はありません。 dir1は100%冗長分散を持ちますが、dir2、dir3、dir4...などはあります。必ずしもそうではありません。 (それら自体が削除候補である可能性があるため、削除候補である可能性がありますが、現在最も有力な候補はdir1です。)
この質問の残りの部分を理解し、答えるために必ず読む必要はありません。ただ話題から抜け出した「なぜ?」と「…試してみましたか?」という質問に答えるだけです。
これは、実際にはかなり一般的な(または少なくともまれな)ように見える要件を作成するためのユースケースです。 ...最小の最終結果は異なります。
- 場所:
- GBの写真と映像を撮りました。
- 毎日、私はメモリカードのファイルをカメラ名と日付別に整理されたフォルダに移動し、冗長アレイのポータブルUSB HDDに移動します。
- 時間があれば整理します。コピーファイル名の前に「yyyymmdd-hhmmss」が付いた「(photo|video)/year/date」のようなフォルダ構造にファイルを置きます。 (つまり、元の構造は完全に混在しており、常に予測可能な方法ではありません。)これらのクリーンなコピーは、高速ワークフローのためにSSDドライブにありますが、管理されていない元のレプリカはバックアップ目的で低速の冗長ストレージに保持されます。 、複製ステップとは別に、複製は物理的に分離されます。
- 家に帰る:
- 私のワークフローに問題がある場合に備えて、管理されていないすべてのファイルをUSB HDDアレイから「永久」(より大きく、強力で継続的なクラウドバックアップ)アレイに移動しました。
- SSDでクリーンアップされたコピーを後処理します。 (名前の変更を除き、元のソースファイルをそのまま残し、変更内容を新しいファイルに保存します。
- 完了したら、目的の結果が得られたら、SSDファイル構造全体を元のファイルと同じ大きな「永続」配列に移動します。 (ただし、ディレクトリ構造は元のSDカードダンプ構造と全く異なることに留意してください。)
理想的には、このワークフローでは、不要になった元のカードダンプフォルダも削除されます。問題は、人生と同様に、ワークフローが継続的に中断されることです。現場で整理する時間がない、家に帰ってしばらく別に片付けておく、毎回同じように整理しない、またはどこにいるのか混乱するだけです。そしてそこに何があり、何も削除することを恐れています。通常、出る前にポータブルメディアが2〜3回そこにあったと疑われても、万が一の場合に備えて永久アレイにコピーします。 (私はOCDではありません。経験のために傷ついただけです。)時々(後でそれほど頻繁ではない)、全体の論理ディレクトリ構造を再構築します。他の場合は、ストリームの途中で更新し、古いコンテンツを無視します。私は長年にわたって場所を移動し、「カードダンプ」ファイルがどこに(そしてどのように)行ったのかわかりません。時々、私のライブワークフローは明確に定義されテストされていますが、さまざまなフォルダが不確実なままの結果をもたらすため、「もしあれば」に備えてより多くのバックアップコピーを作成します。私はまた、私の巨大なフォルダ構造をさまざまな方法で見るために何千ものフォルダシンボリックリンクを生成することができるプログラムを作成しました。 (ファイルシステムの「ピボットテーブル」と同じです。)しかし、「ハードリンクとシンボリックリンクの保存」フラグ設定を忘れたまま、ファイルシステム全体を置換アレイに同期すると、以前にリンクであったもののコピーが作成されます。それから時間が経つと、どちらが本当のオリジナルなのかこれ以上分からなくなります。 (より良い結果を得るには、20年間の写真/動画と30年間の追加データを一緒に使用してみてください!)
つまり、私はどこにでも何百万もの大容量ファイルを持っています。私はそれを修正する必要があります。スペースを節約するだけでなく、(すでに処理された)安全な(そしてより重要なのは標準的な)場所の混乱を減らすことです。私の場合、最初のステップは、コンテンツが他の場所に配布されたと100%確信している(必ずしも自信がない)、何千ものフォルダを削除することでした。各削除候補も迅速な手動確認が必要です。
人間が一生の間にできない初期のリストを生成することです。理想的には、リストは「このディレクトリ内のすべてのファイルは別の場所にありますが、別のディレクトリレイアウトにあり、これらのディレクトリにも一致しないファイルが含まれています」です。しかし、少なくとも、」このディレクトリ内のすべてのファイルは他の場所にも存在します。」。
私は約12の重複排除ソリューションを研究してテストしました。私の「永久」アレイでは、長年にわたってインラインZFS重複排除が有効になっていました。書き込みスループットは約25%に減少しますが、待つことはできますが、数十年にわたって写真を2回、さらに3回複製するために必要な数千ドルの追加のドライブスペースとビデオデータを余裕がありません。 -ウェイミラーストリップ)。
ローカル自動バックアップアレイを設定しました(クラウドバックアップを補完するため)。同じストレージソフトウェアを使用して同時に同じエラーが発生する可能性のある問題を回避するために、Btrfs RAID1を選択しました。 (以前はZFSを使用してこの問題を経験したことがありますが、幸いにも一時的にマウントできなくなりました。)また、このソリューションにはディスクアレイを一度に簡単に拡張または縮小する素晴らしい機能があります。 :-) これは私の大規模な基本的なZFSアレイのための非常に費用がかかり、時間のかかる提案なので、これは良いことです.
とにかく、この質問に関連する唯一の理由は、Btrfsがオフライン重複排除のための多数の優れたユーティリティを持っていることです。私が言ったように、それらのいくつかは問題解決に非常に近いですが、十分ではありません。私が試したことを簡単にまとめると、次のようになります。
- 探す: 高速マッチングアルゴリズムにより、ハードリンクによる重複排除に最適です。問題は、これがすべてのユーザー(すべてのユーザー?)に災害をもたらす可能性があることです。名前や場所にかかわらず、大きくて重複するメディアファイル間のスペースを節約する必要があるという明白なスタンドアロン要件に対して部分的に機能しますが、簡単に解決できない他の問題には災いになることがわかりました。たとえば、関係のない他の同じファイルを一緒にハードリンクすることもできます。たとえば、オペレーティングシステムとアプリケーションによって自動的に生成されるさまざまなメタデータファイルがあり、そのほとんどは数百または数千のディレクトリで同じですが、必ずしも異なる必要があります。たとえば、「Thumbs.db」などのファイルを参照すると、後でデータが失われる可能性があります。 )重複したBtrfs参照リンクを削除するオプションがあります(後でCoWとは区別可能です)、この機能は「実験的」と表示されます。
- Dupuyが削除されました。:重複排除のためにBtrfs参照リンクを使用するので、これは後でファイルを分散しながらディスクスペースを節約するための許容可能な(良い、均一な)方法です。 (現在、Btrfsはデフラグを行うとき(カーネルによって異なります)、ファイルの重複を削除しないようです。スナップショットも同じです。本当にひどいことですが、デフラグをせずに結果を受け入れないことでこれを防ぎます。 )duperemoveの問題は次のとおりです。検索されたすべてのファイルを盲目的にチェックサムし、非常に遅く、ディスクを長時間消費します。基本的に貧しい人の配列を整理します。私の配列は数日かかります。 (bedup、bees、および他のいくつかは他の方法では非常に異なりますが、この点では似ています。rdfindと他のいくつかはよりスマートです。最初にファイルサイズを比較し、次に最初の数バイト、次に最後の数バイトを比較します。すべて一致すればチェックサムに依存しますか)
- リント:これは、現在のディスクスペースを節約するための他の要件に最も適しているようです。 2つのBtrfs再リンクオプション(カーネルモードアトミックレプリケーションとやや強力な「cp --reflink」メソッド)があります。スキャンアルゴリズムは私がテストしたものの中で最も速いです。ハッシングはSHA256以降(ビットを含む)で強化でき、多くの要件を満たす便利なオプションがたくさんあります。 (私が知る限り、この質問に出てきたことを除いて。)
fdupes、fslintなどを含む他の多くの重複排除ユーティリティがあります。私はBtrfsサポートを持っていませんが(ほとんどこの質問には関係ありませんでした)、それらをほとんどテスト(または読みました)しました。 rmlintを除いて、それらのどれも私が必要とする機能に近づいていません。
答え1
fdupesなどのプログラムを使用して、2つの同じファイルから1つのファイルへのハードリンクを作成できます。これはすでにディスク容量を節約する利点があります。
その後、リンク数が1より大きいファイルのみを含むディレクトリがある場合は、すべてのファイルがディスク上の他の場所にあることがわかります。
リンク数が1より大きいファイルのみを含むディレクトリを見つけるには、[すべてのディレクトリリストのインポート]を使用し、[再検索]を使用してリンク数がfind
1のファイルを含むディレクトリを削除します。
この例では、ファイル名またはディレクトリ名のスペースを処理しません。
for dir in `find . -type d`; do
if test -z "$(find $dir -maxdepth 1 -links 1 -quit)"; then
echo $dir
fi
done