
Gegeben:
- ein großer Verzeichnisbaum, der eine Mischung aus Folgendem enthält:
- Dateien mit LF-Zeilenenden
- Dateien mit CRLF-Zeilenenden
- Dateien mit einer seltsamen Mischung aus LF- und CRLF-Zeilenenden (aufgrund eines Fehlers)
- Binärdateien
- andere Dateien, die ich nicht anfassen möchte, auch wenn sie kaputt sind
- Pfade, die möglicherweise Leerzeichen enthalten
Mein Ziel war, die Nur-LF- und Nur-CRLF-Dateien unverändert zu lassen und die Hybriddateien in Nur-CRLF-Dateien zu konvertieren und dabei auch die letzten beiden Gruppen unverändert zu lassen.
Dieser Zauberspruch funktioniert:
find . (some conditions to exclude stuff I don't want to mess with) |
xargs -d '\n' unix2dos -ic | cut -c 3- |
xargs -d '\n' dos2unix -ic | cut -c 3- |
xargs -d '\n' unix2dos
Aber jetzt bin ich neugierig, ob es einen besseren/effizienteren Weg gibt, dies zu tun. (Nur mit Standard-Shell-Tools, nicht mit Perl/Python/usw.)
Der erste Filter unix2dos -ic
dient dazu, die anfängliche Liste auf nur die Dateien zu filtern, die CRLF enthalten, dann dos2unix -ic
werden Unterfilter für die Dateien hinzugefügt, die auch LF enthalten, und der letzte Filter führt die eigentliche Konvertierung durch. Die cut
Aufrufe dienen dazu, die beiden führenden Leerzeichen zu entfernen, die für Verwirrung sorgen xargs
, und der letzte -d
soll Probleme mit Leerzeichen in den Dateinamen lösen, da die Ausgabe nicht in Anführungszeichen gesetzt ist.