`diff -q`の反対を取得できます—内容を印刷せずに同一のファイルを一致させます


13

ディレクトリに多数のファイルがあり、それらがすべて一意であることを確認したい。簡単にするために、3つのファイルfoo.txtがあるbar.txtとしbaz.txtます。このループを実行すると、それらすべてを互いにチェックします。

$ for f in ./*; do for i in ./*; do diff -q "$f" "$i"; done; done
Files bar.txt and baz.txt differ
Files bar.txt and foo.txt differ
Files baz.txt and bar.txt differ
Files baz.txt and foo.txt differ
Files foo.txt and bar.txt differ
Files foo.txt and baz.txt differ

私が処理したい数百のファイルでは、これはかなり読みにくくなります。ファイル一覧表示する方が良いだろうやる試合をして、私はすぐにリストの上に見て、ファイルは自分自身だけに一致していることを確認することができます。マンページから、私は-sオプションがこれを達成すると思っていたでしょう:

$ for f in ./*; do for i in ./*; do diff -s "$f" "$i"; done; done
Files bar.txt and bar.txt are identical
Files baz.txt and baz.txt are identical
Files foo.txt and foo.txt are identical

...しかし、実際には、異なるファイルの内容全体印刷します。この動作を抑制する方法はありますか?そのため、上記の動作しか得られませんか?

あるいは、これを達成できる他のツールはありますか?

回答:


6

2つのファイルが同一であるかどうかだけを確認する場合は、を使用しますcmp。同一のファイルのみの出力を取得するには、次を使用できます。

for f in ./*; do for i in ./*; do cmp -s "$f" "$i" && echo "Files $f and $i are identical"; done; done

diff 人間が読める短い違いのリストを作成しようとしますが、これにはかなりの時間がかかる可能性があるため、必要のない場合はオーバーヘッドを避けてください。


12

これでうまくいくはずです:

diff -rs dir1 dir2 | egrep '^Files .+ and .+ are identical$'

どこdir1dir2あなたの二つのディレクトリです。

一致するディレクトリのみを印刷する場合dir1

diff -rs dir1 dir2 | egrep '^Files .+ and .+ are identical$' | awk -F '(Files | and | are identical)' '{print $2}'

同様に、一致するディレクトリのみを印刷したい場合dir2

diff -rs dir1 dir2 | egrep '^Files .+ and .+ are identical$' | awk -F '(Files | and | are identical)' '{print $3}'

これはまさに私が探していたものです、ありがとう!
ジョシュアソイロー

使用すると、diff -qrs大きなファイルを比較するとき(静かなのを抑制するには、違いを印刷)
marcovtwout

4

最速、その目的のために書かれたツールですfdupes(それはFedoraとUbuntuとのパッケージリポジトリで利用可能です...)

使用法:

fdupes -r dir1 dir2

2

リスト内で同一のファイルを見つける必要がある場合は、まずサイズでソートします。たとえば、

ls -S

次に、同じサイズのファイルのグループごとにmd5sum、それらを実行して、どれがどれと同じかを簡単に確認します。

大きなファイルの場合、最初にファイル全体の短い部分だけをチェックサムする方が速い場合があります。

dd if=file bs=512 count=1 | md5sum

その後、疑わしいファイルに対してのみ完全なチェックサムを実行します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.