他のディレクトリに存在しないファイルを検索する

他のディレクトリに存在しないファイルを検索する

dir1のどこにでも存在するが、 のどこにも存在せず、dir2構造が異なる可能性があるすべてのファイルを見つける必要があるdir1ため、うまく機能しません。dir2diff -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 が必要で、 にはsha512sum128 が必要です。

CYAレベル: 妄想

これは、メタデータがファイルに保存される一部のキャッシュ方式では機能しない可能性があります。名前に元のファイルのハッシュが含まれている

(これは実際に数年前にWordpress + Magentoのインストールで起こりました。古いエントリを削除しながら巨大な記事キャッシュを移行したいと考えていました)。

grepこの場合、誤検知を返したり、メタデータ エントリを元のファイルと間違えたりしないように、別のハッシュ スキーム (クイック フィックス) を使用する必要があります(したがって、キャッシュが MD5 を使用する場合は SHA1 を使用し、その逆も同様です)。または、 を使用しsedて「短い」ファイル内のすべての行を書き換えて先頭に「^」を追加し、アンカー付き正規表現にして、 のフラグを削除して、-Fファイルgrepをプレーン文字列ではなく正規表現として処理します。

答え3

そこで、私が見つけた部分的な解決策は次のとおりです。

find dir1 -type f | grep -vxFf <(fdupes -r dir1 dir2)

ただし、「部分的」と言うのは、 に重複がある場合dir1、それらは表示されないため、fdupes -r dir1最初に を実行する必要があるためです。

関連情報