
dir1
のどこにでも存在するが、 のどこにも存在せず、dir2
構造が異なる可能性があるすべてのファイルを見つける必要があるdir1
ため、うまく機能しません。dir2
diff -r
答え1
パスなしでファイルのリストを作成してみてください。この方法で、2 つのディレクトリを比較できます。ただし、ファイル名はすべて異なる必要があります。 dir1 で異なるサブディレクトリに同じファイル名が繰り返されている場合、パスを削除するとファイル名の一意性が失われます。次のようにして、パス名なしで各ディレクトリのリストを取得できます。
find dir1/ -exec basename {} \; | sort
find dir2/ -exec basename {} \; | sort
全部合わせるとこんな感じになります
diff <(find dir1/ -exec basename {} \; | sort) <(find dir2/ -exec basename {} \; | sort)
fdupes の使用を提案するコメントがあるようです。fdupes
間違いなく、これがより良い解決策です。
答え2
大まかな方法としては、 を使用することもできますmd5sum
。長さが 0 のファイルは常に重複として扱われることに注意してください。そのため、find
少なくとも 1 バイトのサイズのファイルのみを使用することをお勧めします。
find /first/path -type f -exec md5sum -b \{\} \; > /tmp/md5-path1.txt
cut -b1-32 < /tmp/md5-path1-short.txt
find /second/path -type f -exec md5sum -b \{\} \; > /tmp/md5-path2.txt
cut -b1-32 < /tmp/md5-path2-short.txt
path1 にあるが path2 にはないファイル('-v' オプションを削除)
grep /tmp/md5-path1.txt -v -F -f /tmp/md5/path2-short.txt
CYAレベル: プロフェッショナル
上記の 32 は、MD5 ハッシュの長さが 32 バイトであるためです。たとえば、sha1sum
衝突の可能性がさらに低い を使用する場合は、長さ 40 を使用します。sha224sum
には 56 が必要で、sha256sum
には 64 が必要で、 にはsha512sum
128 が必要です。
CYAレベル: 妄想
これは、メタデータがファイルに保存される一部のキャッシュ方式では機能しない可能性があります。名前に元のファイルのハッシュが含まれている。
(これは実際に数年前にWordpress + Magentoのインストールで起こりました。古いエントリを削除しながら巨大な記事キャッシュを移行したいと考えていました)。
grep
この場合、誤検知を返したり、メタデータ エントリを元のファイルと間違えたりしないように、別のハッシュ スキーム (クイック フィックス) を使用する必要があります(したがって、キャッシュが MD5 を使用する場合は SHA1 を使用し、その逆も同様です)。または、 を使用しsed
て「短い」ファイル内のすべての行を書き換えて先頭に「^」を追加し、アンカー付き正規表現にして、 のフラグを削除して、-F
ファイルgrep
をプレーン文字列ではなく正規表現として処理します。
答え3
そこで、私が見つけた部分的な解決策は次のとおりです。
find dir1 -type f | grep -vxFf <(fdupes -r dir1 dir2)
ただし、「部分的」と言うのは、 に重複がある場合dir1
、それらは表示されないため、fdupes -r dir1
最初に を実行する必要があるためです。