Ich habe kein tatsaechliches Problem, sondern frage mich mehr, wie man es machen koennte.
Die Sachlage ist folgende: Es gibt eine Datei (file.md5) in welcher ein 32 Zeichen langer MD5-Hash gespeichert ist ... allerdings mit abschliessendem Newline, wie das unter Unix normal ist. In diesem speziellen Fall muss das Newline am Ende aber entfernt werden, damit die Datei nur noch genau 32 Byte gross ist. Gesucht ist eine automatisierbare Loesung.
Mein erster Ansatz war der:
Code: Alles auswählen
tr -d \\n <file.md5 >temp && mv temp file.md5
Ich wuerde gerne die urspruenglichen Permissions bewahren.
Sich die alten Werte zu merken und am Ende neu zu setzen, waere nur eine Notloesung. Lieber wuerde ich die gleiche Datei ueberschreiben.
Ein Binaer-sed koennte helfen, aber ich will moeglichst mit Standardtools arbeiten.
Ich meine, dass ich in irgendeinem Unix-Buch mal von einer Art `overwrite'-Tool gelesen habe, das allen Input puffert und ihn Ende in die Ausgabedatei schreibt, mit dem Ziel, dieses Problem zu loesen:
Code: Alles auswählen
<file foo | bar | baz >file
Code: Alles auswählen
<file foo | bar | baz | overwrite file
Das ist genau das was ich brauche. Ich muss mal suchen, in welchem Buch das war ...
Jedenfalls frage ich mich, wie man das moeglichst mit POSIX-Mitteln und gleichzeitig einfach umsetzen koennte.
Meine erste Idee war, `sort -o' zu verwenden, weil das genau so funktioniert: Sort muss erst alle Daten lesen, bevor es schreibt und es trunkiert die Ausgabedatei erst wenn es zu schreiben beginnt. Also:
Code: Alles auswählen
tr -d \\n <file.md5 | sort -o file.md5
Also doch selber ein `overwrite' schreiben, z.B. so:
Code: Alles auswählen
overwrite() { in="`cat`"; printf %s "$in" >"$1"; }
Also doch mit awk richtig programmieren?
Hat sonst noch jemand Ideen wie man das auf der Shellebene loesen koennte? Ich wuerde mich ueber eine nette Diskussion freuen.