timecmp 3.2

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] [-y] Verzeichnis1/ Verzeichnis2/

timecmp vergleicht den Inhalt des Verzeichnisses 1 (als linkes Verzeichnis bezeichnet) mit dem Inhalt des Verzeichnisses 2 (als rechtes Verzeichnis bezeichnet) inkl. sämtlicher Unterordner anhand des Zeitstempels (Änderungszeit) und fehlender Dateien. In früheren Versionen hat es dazu die 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 gebraucht. Seit timecmp 3.0 werden KEINE dieser Programme mehr benötigt, da es komplett neu geschrieben wurde rein in C++. Durch die Änderung auf ein reines C++ Programm, das ohne externe Programme auskommt, wurde die Effizienz des Programms maximal erhöht. Ein Beispiel: für zwei Verzeichnisse mit jeweils 250.000 Dateien, also 500.000 Dateien gesamt, hat die alte timecmp Variante vor 3.0 über 28 Minuten gebraucht. Die reine C++ Variante seit Version 3.0 braucht dafür lediglich noch etwas über 2 Minuten!

Zur Arbeitsweise von timecmp: Zuerst wird der Inhalt beider Verzeichnisse erfaßt und anschließend per Änderungsdatum 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 so formatiert, daß sie in der Konsole zentriert ausgegeben wird. Dadurch wird die Anzahl der Zeichen einer Zeile in der Konsole ermittelt, 6 Zeichen als Sicherheit abgezogen und dann der Wert für die linke Spalte halbiert. Damit sind die Pfeile die die Kopierrichtung angeben immer untereinander angeordnet. Zu lange Pfad und Dateiangaben werden abgeschnitten und mit "..." dargestellt. Möchte man mehr von einem langen Pfad sehen, muß man entweder einen größeren Monitor nehmen und die Konsole entsprechend größer darstellen oder die Options-Angabe -c verwenden, mit welcher man den Wert für die linke Spalte von 5 bis 300 Zeichen frei einstellen kann.

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 "n" für Nein abbrechen und es findet keinerlei Änderung an den Verzeichnissen und den darin befindlichen Dateien statt. Wird mit "j" für 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. Fehlen Dateien 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 sinngemäß für links löschen. Bei behalten werden alle fehlenden Dateien jeweils nach rechts oder links kopiert. Werden Dateien gelöscht wird nach jedem Löschvorgang überprüft, ob das Verzeichniss inkl. übergeordneter Verzeichnisse leer ist und falls ja, werden diese Verzeichnisse entfernt, so daß kein Datenmüll in Form von nicht benutzten, leeren Verzeichnissen zurück bleibt. Dieses rekursive Löschen von Verzeichnissen geht aber nur bis zu den als Argumente angegebenen Verzeichnissen, nicht darüber hinaus.

Noch ein Hinweis: Ordner mit folgenden Namen, da sie Systemordner sind, werden von der Erfassung der Dateien ausgeschlossen: lost+found, $RECYCLE.BIN, System Volume Information, Recovery und RECYCLER.

  • 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.

  • Der Fehler, daß timecmp nicht mit Dateien umgehen kann die mehr als ein Leerzeichen im Dateinamen haben, wurde mit Version 2.1 bereinigt. Außerdem wurde intern ein paar Verbesserungen eingebaut.

  • Seit Version 2.2 kann man timecmp auch auf die oberste Verzeichnis-Stufe einer Partition anwenden, da die dort enthaltenen System-Ordner von Linux und Windows mit Namen lost+found, RECYCLE.BIN, System Volume Information und Recovery automatisch ausgefiltert werden.

  • Mit Version 3.0 wurde timecmp komplett überarbeitet, quasi komplett neu geschrieben in reinem C++. Damit kommt es ohne externe Programme aus und ist wesentlich schneller und effizienter als seine Vorgängerversionen. Sämtliche Funktionalitäten wurden dabei beibehalten und ein paar Verbesserungen eingebaut:

    • Früher war die Formatierung an eine feste Anzahl von 48 Zeichen gebunden und konnte mit dem Schalter -c geändert werden. Jetzt wird dieser Wert Anhand der Breite und der damit vorhandenen Zeichen in der Konsole ermittelt, um die Ausgabe mit einem Sicherheitspuffer von 6 Zeichen in der Konsole zu zentrieren. Natürlich kann man nach wie vor den Wert mit der Option -c überschreiben.

    • Ein zusätzlicher Schalter -y wurde eingebaut, welcher es ermöglicht, die erste Abfrage ob ein Abgleich gemacht werden soll zu überspringen.

    • In früheren Versionen gab es kein rekursives Löschen von Ordnern. Es wurde lediglich der Ordner in dem sich die zu löschende Datei befand gelöscht. Wurde durch das Löschen eines Ordners der übergeordnete Ordner leer, blieb dieser erhalten. Durch die rekursive Löschfunktion in Version 3.0 wurde dieses Manko behoben und es bleiben keine leeren Ordner mehr zurück.

Das Programm steht unter der GPL und darf daher von jedem frei verwendet werden. Geschrieben und getestet wurde es unter Debian GNU/Linux, könnte aber auch auf anderen Linux-Distributionen funktionieren. 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.

Zum Download gibts komprimierte tar-Archive, welche den Quellcode und eine ausführbare Datei für die jeweilige Debian Distribution bullseye, bookworm und trixie enthalten. Wer selbst kompilieren will, braucht den Gnu-C++-Compiler (enthalten in dem Paket build-essential), wechselt in das Verzeichnis mit der *.cpp-Datei und kann mittels folgendem Befehl eine ausführbare Datei erstellen:

$ g++ -std=c++20 timecmp.cpp -o timecmp


Downloads

Debian 11 (bullseye) amd64 timecmp3.2-bullseye.tar.gz
Debian 12 (bookworm) amd64 timecmp3.2-bookworm.tar.gz
Debian 13 (trixie) amd64 timecmp3.2-trixie.tar.gz