1つのディレクトリに多くのファイルがあり、ファイルがすべて一意であることを確認したいと思います。単純化のためにfoo.txt
、bar.txt
および3つのファイルがあるとしましょう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
...しかし実際には返品他のファイルの内容全体を印刷します。上記の動作のみが発生するようにこの動作を抑制する方法はありますか?
それとも、そこにありますか?これを行うことができる他のツール?
答え1
これにより、トリックを実行できます。
diff -rs dir1 dir2 | egrep '^Files .+ and .+ are identical$'
2つのディレクトリはどこにdir1
あり、どこにありますか?dir2
一致するディレクトリのみを印刷したい場合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}'
答え2
両方のファイルが同じであることを確認するには、を使用しますcmp
。同じファイルのみを出力するには、次のようにします。
for f in ./*; do for i in ./*; do cmp -s "$f" "$i" && echo "Files $f and $i are identical"; done; done
diff
人が読める短い違いのリストを作成してみてください。これにはかなりの時間がかかる可能性があるため、必要でない場合はオーバーヘッドを避けてください。
答え3
これ最速この目的で作成されたツールは次のとおりです。レプリカ(FedoraとUbuntuのパッケージリポジトリにあります...)
使用法:
fdupes -r dir1 dir2
答え4
リスト内の同じファイルを見つけるには、まずサイズで並べ替えます。
ls -S
その後、同じサイズの各ファイルセットに対してmd5sum
それを実行して、どのファイルが同じであるかを簡単に確認できます。
大容量ファイルの場合は、ファイル全体の小さな部分だけを最初に確認する方が高速です。
dd if=file bs=512 count=1 | md5sum
次に、疑わしいファイルに対してのみチェックサム全体を実行します。