2012-06-18 14 views
9

Używanie Gnome w systemie Linux Mint 12 Skopiowałem folder o wielkości około 9,7 GB (zawierający złożone drzewo podfolderów) z jednego dysku flash NTFS do innego dysku flash NTFS. Według Gnome liczba plików się zgadza, ale według du (i innych programów) liczniki bajtów nie pasują do siebie. (Miałem ten sam problem z kopiowaniem folderów w innych dystrybucjach Linuksa i Windows XP.)Porównaj 2 foldery i znajdź pliki o różnych bajtach

Chcę tylko wiedzieć, które pliki nie mają pasujących liczb bajtów. (Nie chcę porównywać zawartości każdego pliku, ponieważ to by zajęło zbyt długo.) Jaki jest najlepszy, najłatwiejszy i najszybszy sposób na znalezienie niezgodnych z bajtami plików?

+0

rozwiązania One-liner znaleziono powiązanych Unix Stack Exchange Network pytanie: http://unix.stackexchange.com/q/62140 – tanius

Odpowiedz

3

Zakładając, trzeba porównać dir1 i reż 2, tutaj są komendy konsoli:

cd dir1 
find . -type f|sort|xargs ls -l| awk '{print $5,$8}' > ~/dir1.txt 
cd dir2 
find . -type f|sort|xargs ls -l| awk '{print $5,$8}' > ~/dir2.txt 
diff ~/dir1.txt ~/dir2.txt 

Może trzeba będzie zmieniać parametry awk, aby go wydrukować długość pliku i ścieżkę prawidłowo.

6

Czy sprawdziłeś, czy obie partycje mają te same atrybuty? (rozmiar bloku, rozmiar, zarezerwowana przestrzeń dla usunięcia lub uszkodzonych bloków itp.)

Dla twojego konkretnego przypadku, poleciłbym rsync z opcją -n (lub --dry-run). Pokaże ci, które pliki są różne. Czyli:

$ rsync -I -n /source/ /target/ 

Opcja -I jest ignorowanie razy. Możesz użyć tego samego polecenia, aby oba katalogi były równoważne (znacznik czasu, uprawnienia itp.).

Sprawdź podręcznik rsync lub spróbuj użyć opcji --help, aby uzyskać więcej opcji i przykładów, w jaki sposób z niego korzystać. Jest bardzo potężny.

10

Chciałbym dostosować odpowiedź przez @ user1464130, ponieważ ma problemy z obsługą spacji w nazwach plików.

cd dir1 
find . -type f -printf "%p %s\n" | sort > ~/dir1.txt 
cd dir2 
find . -type f -printf "%p %s\n" | sort > ~/dir2.txt 
diff ~/dir1.txt ~/dir2.txt 

Jeśli chcesz uruchomić polecenie na każdym pliku i wykorzystać wynik w raporcie, można użyć konstrukt while bash. W tym przykładzie użyto md5sum do obliczenia sumy kontrolnej dla każdego pliku.

find . -maxdepth 1 -type f -printf "%p %s\n" | while read path size; do echo "$path - $(md5sum $path | tr -s " " | cut -f 1 -d " ") - $size" ; done 

Każdy $() jest wykonywany oddzielnie i pozwala nam obliczyć sumę kontrolną dla każdego pliku. Użycie tr ściska każde kolejne spacje w pojedynczą spację, a cut wyodrębnia słowo w n-tej pozycji, tutaj na pierwszej pozycji. Jeśli tego nie zrobimy, otrzymamy nazwę pliku dwa razy, ponieważ md5sum zwróci go na standardowe wyjście.

Oto przykład bez użycia porównania (nr diff). Zauważ, że użyłem myślnika -, aby podkreślić trzy dane wyjściowe dotyczące każdego pliku, ale może to stanowić problem, jeśli chcesz go podać do innego programu.

$ find . -maxdepth 1 -name "*.c" -type f -printf "%p %s\n" | while read path size; do echo "$path - $(md5sum $path | tr -s " " | cut -f 1 -d " ") - $size" ; done 
./thread.c - 5f2b7b12c7cd12fcb9e9796078e5d15b - 584 
./utils.c - d61bc1dbc72768e622a04f03e3b8f7a2 - 3413 
+0

Jak trudno byłoby, aby dostosować ten skrypt, aby wydrukować sumę kontrolną dla każdego pliku w aukcji ? – mydoghasworms

+0

Zmieniłem moją odpowiedź, aby zapewnić rozwiązanie. Właśnie dodałem sumę kontrolną bez wykonywania porównania. Czy chcesz zmienić sumę kontrolną?Jeśli tak jest, to nie potrzebujesz liczby bajtów i różni się ona nieco od pytania OP. Ponadto suma kontrolna jest lepsza, jeśli chcemy mieć pewność, że oba pliki są takie same lub nie. Możemy nawet dodać czas modyfikacji pliku – lkuty

+0

Gnarly. Wielkie dzięki. – mydoghasworms

Powiązane problemy