Bisakah saya mendapatkan kebalikan dari `diff -q` - mencocokkan file identik tanpa mencetak kontennya


13

Saya memiliki sejumlah file dalam direktori, dan saya ingin memeriksa apakah semuanya unik. Untuk mempermudah, katakanlah saya memiliki tiga file: foo.txt, bar.txtdan baz.txt. Jika saya menjalankan loop ini, saya akan memeriksa semuanya terhadap satu sama lain:

$ 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

Untuk ratusan file yang ingin saya tangani, ini akan menjadi sangat tidak dapat dibaca; akan lebih baik untuk daftar file yang melakukan pertandingan, dan kemudian saya dapat melihat daftar itu dengan cepat dan memastikan bahwa file hanya cocok diri mereka sendiri. Dari halaman manual, saya akan berpikir bahwa -sopsi akan mencapai ini:

$ 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

... Namun, sebenarnya ia juga mencetak seluruh isi dari setiap file yang berbeda. Apakah ada cara untuk menekan perilaku ini, jadi saya hanya mendapatkan perilaku di atas?

Atau, apakah ada alat lain yang dapat melakukan ini ?

Jawaban:


6

Jika Anda hanya ingin memeriksa apakah dua file itu identik atau tidak, gunakan cmp. Untuk mendapatkan output hanya untuk file yang identik, Anda bisa menggunakan

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

diff mencoba membuat daftar singkat, perbedaan yang dapat dibaca manusia, dan ini bisa memakan banyak waktu, jadi hindari overhead jika Anda tidak membutuhkannya.


12

Ini harus melakukan trik:

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

di mana dir1dan dir2dua direktori Anda.

Jika Anda hanya ingin mencetak direktori yang cocok dari dir1:

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

Dan juga, jika Anda hanya ingin mencetak direktori yang cocok dari dir2:

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

Ini persis apa yang saya cari, terima kasih!
Joshua Soileau

Gunakan diff -qrsketika membandingkan file besar (diam-diam menekan perbedaan pencetakan)
marcovtwout

4

Alat tercepat yang ditulis untuk tujuan itu adalah fdupes (tersedia di repo paket Fedora dan Ubuntu dan ...)

Pemakaian:

fdupes -r dir1 dir2

2

Jika Anda perlu menemukan file identik dalam daftar, pertama urutkan berdasarkan ukuran, misalnya dengan

ls -S

kemudian untuk setiap kelompok file berukuran identik, jalankan md5sumdi atasnya untuk melihat dengan mudah yang identik dengan yang.

Untuk file besar, bisa lebih cepat dengan checksum pertama hanya sepotong pendek dari seluruh file:

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

dan kemudian melakukan checksum lengkap hanya pada file yang dicurigai.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.