Mam kilka plików w katalogu i chcę sprawdzić, czy wszystkie są unikalne. Dla uproszczenia załóżmy, że mam trzy pliki: foo.txt
, bar.txt
i baz.txt
. Jeśli uruchomię tę pętlę, sprawdzę je wszystkie względem siebie:
$ 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
W przypadku setek plików, z którymi chcę sobie poradzić, byłoby to dość nieczytelne; lepiej byłoby wymienić pliki, które pasują, a następnie mogę szybko przejrzeć listę i upewnić się, że pliki pasują tylko do siebie. Z tej strony pomyślałbym, że -s
opcja by to osiągnęła:
$ 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
... jednak w rzeczywistości drukuje również całą zawartość wszystkich plików, które się różnią. Czy jest jakiś sposób na powstrzymanie tego zachowania, więc dostaję tylko powyższe zachowanie?
Alternatywnie, czy jest jakieś inne narzędzie, które może to osiągnąć ?
diff -qrs
porównywania dużych plików (cichy tłumi różnice w drukowaniu)Najszybciej narzędzie napisane w tym celu jest fdupes (jest dostępny w repo pakietów Fedory i Ubuntu i ...)
Stosowanie:
źródło
Jeśli chcesz znaleźć identyczne pliki na liście, najpierw posortuj je według rozmiaru, na przykład za pomocą
następnie dla każdej grupy plików o identycznych rozmiarach uruchom
md5sum
je, aby łatwo zobaczyć, które są identyczne z którymi.W przypadku dużych plików szybciej może być najpierw suma kontrolna tylko krótki fragment całego pliku:
a następnie wykonaj pełną sumę kontrolną tylko w przypadku podejrzanych plików.
źródło