Potrzebuję sposobu na porównanie plików w dwóch różnych zestawach lokalizacji, najlepiej w sposób nieco dokładniejszy niż sama nazwa pliku.
Niedawno dostaliśmy nowy NAS do biura i przenosiliśmy na niego dane z różnych dysków twardych USB. Chciałbym móc potwierdzić, że wszystkie pliki zostały pomyślnie przeniesione.
Obejrzałem wiele programów do porównywania plików, ale większość z nich jest wrażliwa na strukturę katalogów, w której znajdują się pliki. Idealnie byłoby po prostu chcieć haszować (MD5 lub podobny) wszystkie pliki na dyskach USB1, USB2 i USB3, a następnie haszować wszystkie pliki na NAS-VOLUME1 i NAS-VOLUME2 i porównać listy, aby zobaczyć, których plików brakuje bok.
Podejrzewam, że można to zrobić za pomocą skryptu lub wiersza poleceń, ale nie jestem zbyt obeznany z pracą z wierszem poleceń w OSX (zwykle faceci w systemie Windows).
Wszelkie wskazówki bardzo mile widziane
źródło
Odpowiedzi:
fdupes
mógłby to zrobić, jeśli jest dostępny na komputerze Mac. Zamontowałbyś wszystkie dyski i pozwoliłbyś, aby fdupes działało po wszystkich katalogach. Byłoby to również najbardziej wydajne (tylko porównywanie plików o tym samym rozmiarze, ponieważ pliki o unikalnym rozmiarze plików nie mogą być duplikatami itp.). Uważaj, ponieważ fdupes jest często używany do usuwania niechcianych duplikatów, więc wiele przykładów może zawierać opcje usuwania.źródło
Ta wersja działa, jeśli nazwy plików i struktury podkatalogów są takie same w obu lokalizacjach. Zaletą tej wersji jest to, że powinna być przyjazna dla pamięci. Zostało to lekko przetestowane pod kątem prostych błędów, ale jest prawdopodobne, że należy uwzględnić więcej. Ponadto podejście bash byłoby znacznie bardziej wydajne, ponieważ python ma dużo narzutu. W zależności od wielkości danych może to zająć dużo czasu.
źródło
Obecnie jedynymi błędami, które ten skrypt uwzględnia, są PermissionError i FileNotFoundError. Niektórych znaków nie można poprawnie obsłużyć, ponieważ są one reprezentowane za pomocą łańcucha kodującego, co spowodowało błąd FileNotFoundError. Dodałem wyjątek KeyboardInterrupt na wypadek, gdyby skrypt działał długo i chcesz zobaczyć skumulowane wyniki. Katalog, z którego uruchamiany jest ten skrypt, będzie zawierał plik o nazwie differenthashes.txt.
Aby wykonać, po prostu zamień „path1” i „path2” w wywołaniu funkcji porównawczej () na dole. Daj mi znać, jeśli masz jakieś sugestie lub uważasz, że to nie odpowiada twoim potrzebom.
źródło