"Diff -q" ın tam tersini alabilir miyim - içeriklerini yazdırmadan aynı dosyaları eşleştirme


13

Bir dizinde birkaç dosya var ve hepsinin benzersiz olup olmadığını kontrol etmek istiyorum. : Kolaylık olması açısından, bu reklam üç dosya var diyelim foo.txt, bar.txtve baz.txt. Bu döngüyü çalıştırırsam, hepsini birbirine karşı kontrol edeceğim:

$ 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

Ele almak istediğim yüzlerce dosya için bu oldukça okunmaz hale gelirdi; o dosyaları listelemek için daha iyi olurdu yapmak maçı, sonra listeyi hızlı bir şekilde bakmak ve dosyaları yalnızca kendilerini eşleşen olduğundan emin yapabilirsiniz. Manpage'den, -sseçeneğin bunu başaracağını düşünürdüm:

$ 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

... ancak aslında farklı dosyaların tüm içeriğini de yazdırır. Bu davranışı bastırmak için herhangi bir yolu var, bu yüzden ben sadece yukarıdaki davranış olsun?

Alternatif olarak, bunu başarabilecek başka bir araç var mı?

Yanıtlar:


6

Sadece iki dosyanın aynı olup olmadığını kontrol etmek istiyorsanız kullanın cmp. Yalnızca aynı dosyalar için çıktı almak için şunu kullanabilirsiniz:

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

diff farklılıkların kısa, insan tarafından okunabilir bir listesini oluşturmaya çalışır ve bu çok zaman alabilir, bu yüzden ihtiyacınız yoksa ek yükten kaçının.


12

Bu hile yapmalı:

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

nerede dir1ve dir2senin iki dizin.

Yalnızca eşleşen dizinleri şuradan yazdırmak istiyorsanız dir1:

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

Aynı şekilde, yalnızca eşleşen dizinleri şuradan yazdırmak isterseniz dir2:

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

Tam da aradığım şey bu, teşekkürler!
Joshua Soileau

diff -qrsBüyük dosyaları karşılaştırırken kullanın (sessiz yazdırma farklılıklarını bastırır)
marcovtwout

4

Bu amaçla yazılan en hızlı araç fdupes'tir (Fedora ve Ubuntu paket depolarında mevcuttur ve…)

Kullanımı:

fdupes -r dir1 dir2

2

Bir listede aynı dosyaları bulmanız gerekiyorsa, önce bunları boyuta göre sıralayın, örneğin

ls -S

her bir özdeş boyutlu dosya grubu için, md5sumhangisi ile özdeş olanı kolayca görmek için üzerlerinde çalıştırın .

Büyük dosyalar için, ilk sağlama toplamından daha hızlı olabilir, tüm dosyanın sadece kısa bir kısmı:

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

ve yalnızca şüpheli dosyalarda tam bir sağlama toplamı gerçekleştirin.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.