timecmp 2.0

Beschreibung: timecmp ist ein von mir selbst geschriebenes kleines Konsolenprogramm für Linux in C/C++ zum Abgleichen von Verzeichnissen per Datumsstempel.

Syntax: timecmp [-v/--version] [-c zeichenbreite] Verzeichnis1/ Verzeichnis2/

timecmp vergleicht den Inhalt des Verzeichnisses 1 mit dem Inhalt des Verzeichnisses 2 inkl. sämtlicher Unterordner. Dazu bedient es sich der Standard-Konsolenprogramme "find" (zum auflisten der Dateien), "ls" (für den Datumsstempel), "mkdir" (zum Erzeugen nicht existierender Verzeichnisse), "cp" um die Dateien zu kopieren, "rm" um sie zu entfernen und "rmdir" um leere Verzeichnisse zu entfernen. Zuerst wird der Inhalt beider Verzeichnisse erfaßt und anschließend per Änderungsdatum (ctime=change time) verglichen. Das Ergebnis wird auf der Konsole ausgegeben, wobei Verzeichnis 1 links und Verzeichnis 2 rechts angeordnet ist. Vom Datum her gleiche Dateien werden nicht ausgegeben, sie erscheinen nur als Zahl in der Zusammenfassung. Ein Pfeil nach links (<-) sagt, daß die Datei in Verzeichnis 2 neuer ist, als in Verzeichnis 1 und somit von rechts nach links kopiert werden sollte um die Datei in Verzeichnis 1 auf den neuesten Stand zu bringen. Ein Pfeil nach rechts (->) sagt sinngemäß das Gegenteil. Bei fehlenden Dateien steht ein "---fehlt---" auf der jeweiligen Verzeichnisseite. Der Übersichtlichkeit halber ist die Ausgabe formatiert, d.h. die linke Spalte hat eine feste Anzahl von Zeichen, damit die Pfeile die die Kopierrichtung angeben immer übereinander angeordnet sind. Ohne Options-Angabe wird die Standard-Breite von 48 Zeichen verwendet. Mit der Option -c kann die Zeichenbreite für die linke Spalte in einem Wertebereich von 5-300 Zeichen frei eingestellt werden.

Am Ende des Vergleichs folgt eine Zusammenfassung, wieviele Dateien insgesamt untersucht wurden (also die Summe beider Verzeichnisse), wieviele davon gleich sind (paarweise gesehen), wieviele unterschiedlich (auch paarweise) und wieviele fehlen (einzeln gesehen). Sind beide Verzeichnisse identisch, folgt ein entsprechender Hinweis und das Programm wird beendet. Gibt es einen Unterschied wird nachgefragt, ob ein Abgleich erfolgen soll. An diesem Punkt kann man das Programm jederzeit mit einem "Nein" abbrechen und es findet keinerlei Änderung an den Verzeichnissen und den darin befindlichen Dateien statt. Wird mit "Ja" geantwortet, werden zuerst die in beiden Verzeichnissen vorhandenen Dateien auf den neuen Stand gebracht, in dem die alten Dateien mit den Neuen überschrieben werden. Anschließend erfolgt eine weitere Abfrage, was mit den fehlenden Dateien geschehen soll. Zur Auswahl steht "l" für links löschen,
"r" für rechts löschen und "b" für beide Seiten behalten. Sollten Dateien auf beiden Seiten fehlen und man wählt rechts löschen, werden nicht nur die links fehlenden Dateien auf der rechten Seite gelöscht, sondern auch automatisch die fehlenden Dateien auf der rechten Seite von links nach rechts kopiert, sozusagen wird das rechte Verzeichnis auf den Dateienstand des linken Verzeichnisses gebracht. Das Gleiche gilt für links löschen. Bei behalten werden alle fehlenden Dateien jeweils nach rechts oder links kopiert. Verzeichnisse die nach einem Löschvorgang leer sind, werden automatisch gelöscht,so daß sich kein Datenmüll in Form von leeren Verzeichnissen ansammelt.

Seit Version 2.0 besteht keine Begrenzung mehr hinsichtlich der maximalen Anzahl an Dateien pro angegebenen Verzeichnis (bei älteren Versionen lag die Zahl bei 99999 Dateien pro Verzeichnis). Die maximale Zahl ist nur noch durch den Arbeitsspeicher begrenzt. Ob der Arbeitsspeicher durch das Erfassen der Dateien voll läuft, wird jedoch nicht überwacht und obliegt der eigenen Kontrolle. Als kleine Hilfe: Zwei Verzeichnisse mit je 10000 Dateien, also 20000 insgesamt, verbraucht bei Gleichheit gerade mal ca. 20 MB Arbeitsspeicher.
Noch ein Hinweis für einen Verzeichnisabgleich über das Netzwerk: Damit die kopierte Datei nicht immer als "Neuer" erscheint, wird cp mit der Option "-p" (Datei-Attribute wenn möglich erhalten) ausgeführt um den Änderungsstempel der Quell-Datei zu erhalten. Hängt man Verzeichnisse per samba in den Verzeichnisbaum ein, ist es natürlich möglich Verzeichnisse auf anderen Rechnern abzugleichen. Allerdings wird das Kopieren einer Datei vom lokalen Rechner auf den entfernten Host eine Fehlermeldung bringen weil die Berechtigungen nicht gesetzt werden können da samba dies nicht unterstützt. Die Datei wird zwar trotzdem kopiert, erscheint aber als Neuer als die Quell-Datei, da der Änderungsstempel auf die Kopierzeit gesetzt wird. Für dieses Verhalten habe ich einen Workaround in timecmp eingebaut: Das Programm überprüft, ob der cp-Befehl erfolgreich war und führt bei nicht erfolgreich den Befehl touch aus, um den Zeitstempel doch noch abzugleichen. Versuche meinerseits haben gezeigt, daß selbst bei korrekter samba-Konfiguration "cp -p" eine Fehlermeldung bringt, während touch funktioniert. Allerdings sind dafür in der Datei smb.conf zwei Einträge zu tätigen. Unter [global] ist "dos filemode = yes" einzutragen und unter der jeweiligen Freigabe
"dos filetimes = yes".

Das Programm steht unter der GPL und darf daher von jedem frei verwendet werden. Geschrieben und getestet wurde es unter Debian GNU/Linux Codenamen lenny, squeeze und wheezy, könnte aber auch auf anderen Linux-Distributionen funktionieren, sofern eine bash als Konsole vorhanden ist und die Standard-Konsolen-Programme find, ls, mkdir, cp, rm und rmdir ebenfalls zur Verfügung stehen. Für auftretende Fehler, Schäden oder Datenverlust die das Programm verursacht, übernehme ich keinerlei Haftung. Die Benutzung erfolgt auf eigene Gefahr, jedoch ist die Wahrscheinlichkeit, daß nach dem Gebrauch das System nicht mehr funktioniert sehr gering, da das Programm lediglich Dateien kopiert oder löscht und bei Bedarf Ordner anlegt oder löscht. Bis zu der Ja/Nein-Abfrage wird an den Verzeichnissen auch nichts verändert, somit kann man das Programm auch nur dazu benutzen, um eventuelle Unterschiede in den Verzeichnissen anzeigen zu lassen.

Wer selbst kompilieren will, braucht den Gnu-C++-Compiler (enthalten in dem Paket build-essential) und kann mittels folgendem Befehl eine ausführbare Datei erstellen:

# g++ timecmp.cpp -o timecmp


Download

  32-Bit (i386) 64-Bit (amd64)
Debian lenny timecmp timecmp
Debian squeeze timecmp timecmp
Debian wheezy timecmp timecmp
Quellcode
timecmp.cpp