Ich hab grad zwei Stunden an einem Bash-Skript rumgebastelt um dann zu realisieren, dass das was ich machen will in weniger als 20 Sekunden mit anderen Befehlen lösbar ist – naja, wenigstens hab ich was bei gelernt, vielleicht. Aber der Reihe nach.
Ich hab mir zwei 1TB-Platten für ein Raid1 gekauft um meine Daten vor spontanen Festplattenausfällen zu schützen. Ist zwar keine vollständige Backup-Strategie (Viren, Fehlbedienung, Blitzschlag, etc), aber mir lang das, da ich mir schließlich fest vorgenommen habe keine Viren einzufangen und Fehlbedienung natürlich völlig ausgeschlossen ist
Nach dem Einbau wollte das neu erstellte Dateisystem auf dem Raid schnell nicht mehr. Merke: Man erstellt auch auf dem md-Device erst eine Partition (etwa mit fdisk) und schreibt da rein. Zwar halten das die ganzen Tutorials für unnötig, da mkfs.ext4 das automagisch eh selbst macht, aber der Fehler im Dateisystem bestand nachher darin, dass das Dateisystem dachte, es sei so groß wie das md-Device und es in Wahrheit aber nur so groß wie die Partition war. Mit dem selber machen gings dann… zumindest einen Tag. Dann wollte mein Intel AHCI-Bios nicht mehr mit den Platten reden, aber in einem USB-Gehäuse wars ok. Doofes Teil. 3h Fehlersuche hat nichts zu tage befördert, allerdings war CMOS-Reset und AHCI deaktivieren ein gangbarer Workaround. Glücklich bin ich nicht so recht, aber immerhin läufts jetzt.
Also geh ich freudig hin und kopiere alle Daten von der alten PATA-NTFS-Platte aufs Raid. Und weil man Dinge ja professionell machen mag (grad nachdem die neuen Platten schon so doof zu mir und meinem AHCI-Bios waren), macht man hinterher von den Quelldaten md5s und von den Daten, die nun auf dem Raid gelandet sind. Nun muss man nur noch die beiden md5-Ausgaben (die jeweils in einer Datei gelandet sind) per diff vergleichen und alles ist toll… HEY? Moment mal, da sind ja tausendundein diff??
Stellt sich also heraus, dass “md5sum * > somefile” auf verschiedenen Dateisystemen die Daten in verschiedenen Reihenfolgen ausliest. Tja, also habe ich nun die Aufgabe herauszufinden ob für eine Datei in der Quelldateien-md5-Liste (nennen wir sie Q) die selbe md5 hat wie in der Zieldateien-md5-Liste (nennen wir sie Z), wobei die Datei irgendwo stehen darf. Leider gibts da kein Tool für. Selbst md5sum könnte höchstens Q nehmen und Z auf dem Raid neu berechnen. Aber nochmal 1h md5s erzeugen lassen? Nein, das wäre ja Ressourcenverschwendung. Als muss man es wohl selber programmieren. Und ich wollte immer schon mal Bash-Programmierung lernen (hab das noch nie gemacht). Also hab ich ein Editor aufgemacht und Google nach Bash Tutorial ausgefragt.
Raus kam dann ein 20 zeiliges Skript. Es hat für jede Zeile in Q (bestehend aus “md5 Datei”) die Datei ausgelesen (inkl Pfad), in Z nach der Datei gesucht und die md5-Summen verglichen. Hat auch fast funktioniert. Nur hatte ich dauernd so Probleme, dass grep $FILE $Z nur dann funktioniert hat, wenn in FILE nicht doppelte Leerzeichen oder andere fiese Dinge drin waren. Auch fies war, dass grep sich auch damit zu frieden gegeben hat, wenn der String teilweise drin vorkam. Passiert nur leider echt oft, dann man hat unter Linux zu einer Datei AlleMeineGeheimnisse.txt auch gerne die Backup-Datei AlleMeineGeheimnisse.txt~ und die kann einen anderen Inhalt haben und somit auch eine andere md5, etc…
Ich hab die meisten meiner Fehler fixen können, aber manches blieb schleierhaft. Etwa dass es grep egal zu sein scheint ob es ein oder zwei Leerzeichen sind. Aber dann kam der Geistesblitz, wie es doch alles viel einfacher geht: “sort Q > Qs; sort Z > Zs; diff Qs Zs“, Fazit: Keine diffs. Und ich hab 2h an meinem doofen Skript gebastelt…
Und was ist die Moral von der Geschichte? If in doubt: sort! (das hab ich nun schon in einigen verschiedenen Algorithmik-Büchern gelesen; scheint wohl was dran zu sein). Naja, vielleicht hab ich ja wenigstens was bei gelernt
Oder gleich diff -r auf die Daten?
ich glaube, diff -r wäre nicht gegangen, weil auch Binarys dabei sind. Aber unabhängig davon, mit einer MD5-Liste (etwa Q) und dann einfach “md5sum -c Q” im Zielordner hätte es auch getan.
Ich wollte schon ausgehend von den beiden Liste Q und Z das Problem lösen – ein wenig Spaß muss man sich ja noch gönnen. Nur ist mir halt die einfache Lösung mit sort nicht aufgefallen.