2012-06-18 4 views
9

Verwenden von Gnome in Linux Mint 12, kopierte ich einen Ordner von etwa 9,7 GB (mit einem komplexen Baum von Unterordnern) von einem NTFS-Flash-Laufwerk auf ein anderes NTFS-Flash-Laufwerk. Laut Gnome stimmen die Dateizahlen überein, aber gemäß du (und anderen Programmen) stimmen die Byte-Zählungen nicht überein. (Ich hatte das gleiche Problem beim Kopieren von Ordnern in anderen Linux-Distributionen und Windows XP.)Vergleichen Sie 2 Ordner und finden Sie Dateien mit unterschiedlichen Byte-Zähler

Ich möchte nur wissen, welche Dateien keine übereinstimmende Byteanzahl haben. (Ich möchte nicht den Inhalt jeder Datei vergleichen, weil das viel zu lange dauern würde.) Was ist der beste, einfachste und schnellste Weg, um die Byteanzahl zu finden, die nicht übereinstimmen?

+0

One-Liner gefunden Lösungen für damit verbundene Frage Unix Stack: http://unix.stackexchange.com/q/62140 – tanius

Antwort

3

Angenommen, Sie dir1 und dir 2 vergleichen müssen, hier sind die Konsolenbefehle:

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 

Sie müssen möglicherweise awk Parameter bearbeiten, um sie richtig Dateilänge und Weg machen drucken.

6

Haben Sie überprüft, ob beide Partitionen die gleichen Attribute haben? (Blockgröße, Größe, reservierter Platz für Löschungen oder fehlerhafte Blöcke usw.)

Für Ihren speziellen Fall würde ich rsync mit der Option -n (oder --dry-run) empfehlen. Es wird Ihnen sagen, welche Dateien unterschiedlich sind. Das heißt:

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

Die Option -I ist mal zu ignorieren. Sie können denselben Befehl verwenden, um beide Verzeichnisse gleichwertig zu machen (Zeitstempel, Berechtigungen usw.).

Überprüfen Sie das Handbuch von rsync oder versuchen Sie die Option --help, um weitere Optionen und Beispiele zu bekommen, wie es zu benutzen. Es ist sehr mächtig.

10

Ich würde die Antwort von @ user1464130 anpassen, da es Probleme bei der Behandlung von Leerzeichen in Dateinamen hat.

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 

Wenn Sie einen Befehl für jede Datei gestartet werden sollen und das Ergebnis in dem Bericht verwenden, können Sie das while Bash-Konstrukt verwenden. In diesem Beispiel wird md5sum verwendet, um eine Prüfsumme für jede Datei zu berechnen.

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 

Jeder $() wird separat ausgeführt und ermöglicht es uns, die Prüfsumme für jede Datei zu berechnen. Die Verwendung von tr quetscht alle aufeinanderfolgenden Leerzeichen in ein einzelnes Leerzeichen und extrahiert das Wort in der n-ten Position, hier in der ersten Position. Wenn wir das nicht tun, erhalten wir den Namen der Datei zweimal, weil md5sum es auf stdout zurückgibt.

Hier ist ein Beispiel ohne Verwendung des Vergleichs (keine diff). Beachten Sie, dass ich einen Bindestrich verwendet habe, um die drei Daten hervorzuheben, die wir über jede Datei ausgeben, aber es könnte ein Problem sein, wenn Sie es einem anderen Programm zuführen möchten.

$ 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

Wie schwierig wäre es für jede Datei eine Prüfsumme drucken in der Liste sein, um dieses Skript anpassen ? – mydoghasworms

+0

Ich habe meine Antwort bearbeitet, um eine Lösung zu finden. Ich habe gerade die Prüfsumme hinzugefügt, ohne den Unterschied zu machen. Möchten Sie die Prüfsumme unterscheiden?Wenn dies der Fall ist, brauchen Sie die Byteanzahl nicht und sie unterscheidet sich ein wenig von der OP-Frage. Außerdem ist die Prüfsumme besser, wenn wir sicher sein wollen, dass beide Dateien gleich sind oder nicht. Wir könnten sogar eine Datei Modifikationszeit – lkuty

+0

Gnarly hinzufügen. Danke vielmals. – mydoghasworms