Znalezienie duplikatów plików

Zaczęty przez TJM, 23 Maj 2009, 23:56

TJM

Dostałem do przeglądu kompa z wieloma hdd, na których znajduje się masa róznych plików, często powtarzających się po różnych katalogach, a trzeba zrobić z tym porządek.
Poszukuję programu który mi znajdzie powtarzające się pliki, najlepiej z możliwością ustawienia wykluczeń, bo np. na paru partycjach są stare instalki windy, program bez filtrów zapewne wyświetli mi to na dzieńdobry jako kilkaset albo nawet kilka tysięcy duplikatów na liście, przez co będę musiał się potem przedzierać.
Oprócz tego obowiązkowo progs musi sprawdzać sumy kontrolne plików. Wczoraj trochę się bawiłem i zmarnowałem parę godzin, testowałem easy duplicate findera - szybko skanuje, ale sum kontrolnych chyba nie sprawdza (albo jego algorytmy sypią się na dużych plikach), bo pooznaczał mi jako duplikaty całkowicie różne, duże mpeg-2 przygotowane do wypalenia na dvd.
Testowałem również napisany w javie progs (niestety zapomniałem nazwy), o ile na jednej partycji jakoś daje radę, to po podaniu mu do strawienia 10-ciu dysków po prostu klęka, działa tak wolno, że po godzinie znudziło mi się czekanie na samo załadowanie listy katalogów.
Testowałem również jakiś sharewareowy dupe finder - ten to w ogóle masakra, nawet nie jest w stanie przeskanować jednego dysku na którym jest zaledwie ze 100k plików.

Może ktoś poleci jakiś dobrze napisany soft który się nie posypie ? Jutro będę dalej dzialał z tematem, kojarzę jeszcze, że jakiś program czyszczący rejestr i tempy miał jako funkcję uboczną szukanie duplikatów i całkiem to spoko działało, muszę go poszukać...


W razie jakiejś pilniejszej sprawy - jestem często dostępny na kanale IRC B@P, na forum czasami zapominam zajrzeć lub nie mam czasu.

Pigu

synchronizacja katalogów w total commander nie starczy? :D

KrzychuP

Ja swego czasu używałem Easy Cleaner'a
Tylko nie pamiętam, czy sprawdzał sumy kontrolne...

Troll81

#3
http://www.easyfreeware.com/duplicate_file_eraser-3715-freeware.html

TJM

Easy Cleaner jest niezły, teoretycznie niby sprawdza zawartość plików, ale w praktyce czasami mu nie wychodzi i oznacza różne pliki jako takie same, przy tej samej długości lecz różnej zawartości.
Pigu natomiast olśnił mnie swoim postem, co prawda synchronizacja katalogów w TC nic nie daje, ale przecież TC w wyszukiwarce plików ma opcję wyszukiwania duplikatów. Działa wolno, ale nie wiesza się przy paru milionach plików na kilkunastu dyskach.

W razie jakiejś pilniejszej sprawy - jestem często dostępny na kanale IRC B@P, na forum czasami zapominam zajrzeć lub nie mam czasu.

sesef

a co z polskim programem Odkurzacz Pro czy jakoś tak, google na pewno znajdzie. Z tego co pamiętam ma możliwość wyszukiwania duplikatów i ustawienia filtrów, tylko nie pamiętam czy sprawdza czy są duplikaty na innej partycji czy ogranicza się tylko do jednej.

TJM

#6
Nie mogąc znaleźć idealnego programu, wziąłem sprawy w swoje ręce.
Większość progsów coś ściemnia z duplikatami, albo ich nie zauważa, albo podaje jako duplikaty pliki bez dokładnego sprawdzania ich zawartości (jeśli podejrzanie szybko skanuje np. 4GB pliki .ISO, to znaczy że coś jest nie tak).
Jako że nie jestem programistą zajęło mi to dzisiaj całe 6 godzin, ale napisałem programik który:

1) ładuje listy plików - wyświetla kolejne requestery gdzie można wybierać całe dyski, foldery, zmapowane dyski sieciowe lub lokalizacje sieciowe, dyski wymienne, napędy optyczne itp. Praktycznie wszystko co widzi Windows. Anulowanie requestera powoduje przejście dalej.

2) Tworzy listę plików w wybranej lokalizacji (lokalizacjach)

3) Tworzy listę plików o takim samym rozmiarze.

4) Dla plików które mają takie same rozmiary, generuje CRC32. Jeśli CRC32 dla dwóch plików jest takie samo, przechodzi do punktu 5.
5) generuje dla dwóch plików MD5. Jeśli jest takie samo, przechodzi do punktu 6.
6) generuje dla dwóch plików SHA-1. Jeśli jest takie samo, wpisuje plik do logu wraz z listą duplikatów:


Lista duplikatów dla pliku: I:\BOINC\BOINCGUIApp.ico
Wielkość w bajtach: 284646
CRC32: AEBE1F94
MD5: 0814E6CCC656D7C7BDA6E202C46D0E5F
SHA-1: E4EBF9979BB20E89A10003185C3F59111E7ADBDA
I:\boinc_core_release_6_5_0\client\win\res\.svn\text-base\icon.ico.svn-base
I:\boinc_core_release_6_5_0\client\win\res\icon.ico
I:\boinc_core_release_6_5_0\clientgui\res\.svn\text-base\BOINCGUIApp.ico.svn-base
I:\boinc_core_release_6_5_0\clientgui\res\BOINCGUIApp.ico
I:\boinc_core_release_6_5_0\clientgui\res\templates\.svn\text-base\boinc.ico.svn-base
I:\boinc_core_release_6_5_0\clientgui\res\templates\boinc.ico
I:\boinc_core_release_6_5_0\clientscr\res\.svn\text-base\icon.ico.svn-base
I:\boinc_core_release_6_5_0\clientscr\res\icon.ico
I:\boinc_core_release_6_5_0\win_build\installerv2\redist\.svn\text-base\setup.ico.svn-base
I:\boinc_core_release_6_5_0\win_build\installerv2\redist\setup.ico
I:\My Dropbox\HAL2\HAL2\BOINCGUIApp.ico
I:\My Dropbox\shared_bm\HAL2_1.1.0\HAL2\HAL2\BOINCGUIApp.ico


Lista duplikatów dla pliku: I:\BOINC\ca-bundle.crt
Wielkość w bajtach: 242471
CRC32: 41ED48A8
MD5: B47D676F8C560F27FC69417E7C956D37
SHA-1: 3B9E07E62E643FF521D73F0C69EBFADE876F8841
I:\My Dropbox\HAL2\HAL2\ca-bundle.crt
I:\My Dropbox\shared_bm\HAL2_1.1.0\HAL2\HAL2\ca-bundle.crt


Lista duplikatów dla pliku: I:\BOINC\COPYING
Wielkość w bajtach: 35821
CRC32: BA8CD1A6
MD5: 3C34AFDC3ADF82D2448F12715A255122
SHA-1: 7713A1753CE88F2C7E6B054ECC8E4C786DF76300
I:\My Dropbox\HAL2\HAL2\COPYING
I:\My Dropbox\shared_bm\HAL2_1.1.0\HAL2\HAL2\COPYING


Program jest dość powolny, z racji tego, że pracuje z ogromnymi tablicami - trzyma w pamięci listę plików (która podczas wykonywania się kurczy, bo skreślone zostają sprawdzone pliki i od razu ich kopie), trzyma też tablice ich rozmiarów oraz wszystkich już wyliczonych sum kontrolnych, żeby oszczędzić na operacjach dyskowych. Użycie pamięci też jest dość spore, z racji tego, że trzyma pełne ścieżki do wszystkich plików - szacunkowo jest to jakieś 10MB na 50,000 plików, ale oczywiście zależy od średniej długości ścieżki - przykładowo dla ścieżek sieciowych zawsze jest więcej.
Sytuacja kiedy oznaczy dwa różne pliki jako duplikaty nie powinna nigdy wystąpić - szanse że dla różnych plików rozmiar, CRC32, MD5 i SHA1 będą identyczne są raczej nieprawdopodobnie małe.

Gdyby ktoś chciał potestować albo miało się to do czegoś przydać, chętnie udostępnię.


W razie jakiejś pilniejszej sprawy - jestem często dostępny na kanale IRC B@P, na forum czasami zapominam zajrzeć lub nie mam czasu.

Szopler

:)

Uśmiecham się o program - posprzątam sobie na domowym serwerku z plikami...
Mail @ PW

Peciak

#8
jv16 kiedyś był darmowy ale co dobre szybko się kończy

,,Z szanowania wzajemnego wypływa moc wielka w chwilach trudnych."

TJM

#9
Na razie poprawiam bugi, bo cholercia skwasiłem coś i podczas skracania tablic (program robi to po każdych 100 przeskanowanych plikach) lista plików się kaszani.
Od razu dorzuciłem opcję podania minimalnego rozmiaru poniżej którego pliki są ignorowane.
Edit: co ciekawe, nowy autoit (w tym języku napisany jest progs) ma możliwość tworzenia 64 bitowych exeków. Gdyby więc jakiś szaleniec wpadł na pomysł skanowania progsem dysku zawierającego parędziesiąt milionów plików ( XD ) to nic nie stoi na przeszkodzie, o ile będzie miał 64 bitową wersję programu, system operacyjny i dostateczną ilość pamięci  XD

W razie jakiejś pilniejszej sprawy - jestem często dostępny na kanale IRC B@P, na forum czasami zapominam zajrzeć lub nie mam czasu.

TJM

Prace nad softem mi się opóźniają, bo wczoraj po paru godzinach żmudnego poszukiwania znalazłem bug/problem nad którym trochę muszę posiedzieć. Korzystałem z funkcji bibliotek systemu operacyjnego do generowania crc32/md5/sha1.
Niestety co się okazuje, te funkcje ładują cały plik do pamięci. Oczywistą zaletą jest to, że generowanie sum kontrolnych jest dzięki temu superszybkie. Niestety skanowanie dużych plików zamula kompa, a skanowanie plików o wielkości większej od ilości pamięci niemożliwe.
Dlatego poprawiona wersja będzie prawdopodobnie dźwigać ze sobą również dodatkowe komendy. Widziałem kiedyś takie pliczki dla Win2k+: MD5.exe, SHA1.exe i CRC32.exe. Zmienię to tak, żeby dla plików poniżej kilkudziesięciu MB progs używał wewnętrznych procedur, dla większych zewnętrznych, skanujących plik bez ładowania całości.

Aktualna wersja work in progress: http://dl.enigmaathome.net/1536xw35nx/DupeSearch.exe od razu ostrzegam, że ma sporo bugów i lepiej nie wierzyć w rezultaty które podaje, zwłaszcza dla dużych plików. Kto chce zobaczyć źródło, aplikację można 'zdekompilować' narzędziem z pakietu autoita (exe2aut).

W razie jakiejś pilniejszej sprawy - jestem często dostępny na kanale IRC B@P, na forum czasami zapominam zajrzeć lub nie mam czasu.

apohawk

Na linuksa jest "duff":
http://duff.sourceforge.net/
Sprawdza na podstawie md5 lub sha1 jeśli dobrze pamiętam. Może się przyda.
Wersji na windowsa "DUFF" nie testowałem. http://dff.sourceforge.net/
No good deed goes unpunished.

TJM

#12
Głównie chodzi mi o to, żeby program miał możliwość przeszukiwania wszystkich rodzajów nośników, włącznie z sieciowymi. Dlatego właśnie piszę swój skrypt, bo gotowca ciężko znaleźć.

EDIT:

This is the homepage of DUFF, a GUI duplicate file finder and processor for Windows. It is a project I started a few years ago, but left alone since I stopped using Windows.

If you are interested in continuing this project, please let me know.

Może lepiej poprawić bugi w tym ?

EDIT: Źródło jest dostępne, więc nie ma co wyważać otwartych drzwi - poużywam trochę i zobaczę czy da radę poprawić ewentualne bugi o których pisze autor.


EDIT2: znalazłem dwa problemy które umiem poprawić - crash przy czyszczeniu listy i wolne skanowanie bardzo dużych plików. Niestety, do kompilacji potrzeba Visual Studio z kompletem bibliotek. Wszystko mam oprócz płatnych MFC (taka wersja VS 2005/2008) więc chwilowo zaciąłem się na tym etapie :/

EDIT3: źródła DUFFa niestety zawierają ogromne ilości błędów, projekt pochodzi z MS VC++ 6.0 który jest niekompatybilny z dzisiejszymi standardami. Większość dość łatwo poprawiłem, ale mam problem z przerobieniem ładowania fragmentu pliku do pamięci, użyty przez autora sposób jest nie do naprawienia, co najwyżej do wymiany.

W razie jakiejś pilniejszej sprawy - jestem często dostępny na kanale IRC B@P, na forum czasami zapominam zajrzeć lub nie mam czasu.

Szopler


TJM

Zostawiłem DUFFa na razie w spokoju, bo poprawienie go do standardowego C++ przerasta chwilowo moje możliwości.
Poprawiłem swój progs na tyle, żeby dało się go używać z plikami dowolnej wielkości - teraz dla dużych używa porównania binarnego. Nie jest to najszybsze, ale tragedii nie ma. Dorzuciłem też tryb 'interaktywny' - znalezione duplikaty można na miejscu kasować.

W razie jakiejś pilniejszej sprawy - jestem często dostępny na kanale IRC B@P, na forum czasami zapominam zajrzeć lub nie mam czasu.

Szopler

Rozwinęło się coś więcej?

TJM

Dopracowałem tylko swój skrypt, w sumie nadal ma jakieś drobne błędy ale nawet nie chciało mi się ich szukać.
Dla mniejszych plików liczy sumy kontrolne, dla większych, gdzie brakuje pamięci - porównuje pliki binarnie, przy czym robi to po kawałku - jeśli jeden z kawałków będzie się różnił chociaż 1 bajtem, porównywanie jest przerywane bo dalej nie ma po co.
Tyle mi wystarcza, w połączeniu z filtrem rozmiarów i interakcją (możliwość kasowania plików w locie na podstawie odpowiedzi użytkownika) skrypt jest całkiem użyteczny - można np. szybko przeczyścić kolekcję MP3 czy filmów.

W razie jakiejś pilniejszej sprawy - jestem często dostępny na kanale IRC B@P, na forum czasami zapominam zajrzeć lub nie mam czasu.