同じ内容のディレクトリ内のすべてのフォルダを検索します


10

Ubuntuで、ディレクトリ内の重複するフォルダー(つまり、同じ内容のフォルダー)を見つけるものはありますか?重複するファイル(fdupesなど)を見つけるためのコマンドラインツールは既にいくつかあると思いますが、代わりに重複するフォルダーを見つけたいと思います。つまり、ファイル名と他のメタデータは異なる場合がありますが、それらに含まれるファイルの内容に関して一致するフォルダーを見つけます。


まず、ディレクトリ内のすべてのフォルダーのリスト(長さで並べ替え)を生成し、同じ長さのフォルダーの各ペアを確認します。
アンダーソングリーン

「複製」を定義します。内部のファイルは単にファイルの内容と一致する必要がありますか?ファイル名?iノード番号?ファイルサイズ?
クリスダウン

@ChrisDown質問が更新されました。
アンダーソングリーン

3
はい。ディレクトリは実際には単なるファイルなので、ステートメントがあいまいです。「同じ内容」を実際に持つということは、両方のディレクトリに同じiノード参照が含まれていることを意味します。それが意味するのか、それとも内部ファイルが同じ内容でなければならないのか、そうでなければ、他の規定(mtime、filenameなど)があるのか​​は不明です。
クリスダウン

3
@ChrisDown内部のファイルは同じ内容でなければならないことを意味します。
アンダーソングリーン

回答:


5
#!/bin/bash
shopt -s dotglob

for file in "$1"/*; do [[ -f "$file" ]] && d1+=( "$(md5sum < "$file")" ); done
for file in "$2"/*; do [[ -f "$file" ]] && d2+=( "$(md5sum < "$file")" ); done 

[[ "$(sort <<< "${d1[*]}")" == "$(sort <<< "${d2[*]}")" ]] && echo "Same" || echo "Different"

あなたはここでそれを実際に見ることができます:

$ mkdir 1 2
$ ./comparedirs 1 2
Same
$ cat > 1/1 <<< foo
$ cat > 2/1 <<< foo
$ ./comparedirs 1 2
Same
$ cat > 2/1 <<< bar
$ ./comparedirs 1 2
Different

このスクリプトはテストされていないため、想定どおりに機能するかどうかを確認したいと思っています。
アンダーソングリーン

1
@AndersonGreen更新された回答を確認し、テストしました。
クリスダウン

いいね!そこもでテストする必要がありますcat > 1/2 <<< barし、cat > 2/3 <<< bar 複数のファイルと異なるメタデータ(==「同じ」)を示すために
nealmcb

@ChrisDown:最後のステップでのソートは必要ですか?
harish.venkat 14年

エレガントなスクリプトですが、マイナーなバグは、一方または両方のディレクトリが存在しない場合にSameを返すことです。1はI.よりもスクリプティングに優れている場合は簡単に修正可能でなければなりません
コサイン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.