Folgende Situation:
Ich arbeite an einem Mac mit OS X und bin kürzlich einem Projekt beigetreten, dessen Mitglieder bisher alle Windows verwenden. Eine meiner ersten Aufgaben war das Einrichten der Codebasis in einem Git-Repository. Deshalb habe ich den Verzeichnisbaum von FTP abgerufen und versucht, ihn in das Git-Repo einzuchecken, das ich lokal vorbereitet hatte. Als ich das versuchte, bekam ich nur das
fatal: CRLF would be replaced by LF in blog/license.txt.
Da dies alle Dateien unterhalb des Ordners "Blog" betrifft, suche ich nach einer Möglichkeit, ALLE Dateien in der Baumstruktur bequem in Unix-Zeilenenden zu konvertieren. Gibt es ein Tool, das das sofort erledigt, oder bekomme ich selbst Skripte?
Als Referenz meine Git-Konfiguration bezüglich Zeilenenden:
core.safecrlf=true
core.autocrlf=input
quelle
find blog -type f | xargs dos2unix
sollte schneller sein. Sie benötigen das auch-name *.*
nicht, es sei denn, Sie möchten ausdrücklich nur Dateien mit einem Punkt irgendwo im Namen. Das ist ein Windows Glob, kein * Nix.find
toxargs
schlägt fehl, wennfind
Dateien mit Leerzeichen, Anführungszeichen oder anderen Shell-Metazeichen in ihrem Pfad übereinstimmen. Zumindest verwendenfind blog -type f -print0 | xargs -0 dos2unix
, um den Fall von Leerzeichen zu behandeln. Sie müssenfind
's-exec
anstelle von Piping verwenden, um Anführungszeichen usw. zu vermeiden. Diedos2unix
Manpage gibt nicht an, wie sie sich verhält, wenn Sie sie für Binärdateien aufrufen. Wenn CRLF in Binärdateien konvertiert wird, werden diese beschädigt. Siehe meine Antwort für eine sicherere, wenn auch längere Alternative.Angenommen, Sie haben GNU
grep
undperl
dies konvertiert CRLF rekursiv in LF in nicht-binären Dateien unter dem aktuellen Verzeichnis:Wie es funktioniert
Rekursiv im aktuellen Verzeichnis suchen; Ändern Sie
.
inblog
oderwhatev
Unterverzeichnisse, um das Ersetzen einzuschränken:Nur mit regulären Dateien übereinstimmen:
Testen Sie, ob die Datei CRLF enthält. Binärdateien ausschließen. Führt den
grep
Befehl für jede reguläre Datei aus. Das ist der Preis für den Ausschluss von Binärdateien. Wenn Sie einen alten haben, könnengrep
Sie versuchen, einen Test mit dem folgendenfile
Befehl zu erstellen:Ersetzen Sie CRLF durch LF. Das
'+'
with the second-exec
weist Siefind
an, übereinstimmende Dateien zu akkumulieren und an einen (oder möglichst wenige) Aufrufe des Befehls zu übergeben - wie das Weiterleiten anxargs
, jedoch ohne Probleme, wenn der Dateipfad Leerzeichen, Anführungszeichen oder andere Shell-Metazeichen enthält. Dasi
In-pi
weist Perl an, die vorhandene Datei zu ändern. Sie könntensed
oderawk
hier mit etwas Arbeit verwenden, und Sie werden wahrscheinlich '+' in ';' ändern. und rufen Sie für jedes Spiel einen eigenen Prozess auf:quelle
grep -qIP '\r\n'
nie etwas mit meinem CentOS-System überein. Ändern Sie es zugrep -qIP '\r$'
funktioniert.node_modules
?find
Teil des Befehls so ändern , dass Verzeichnisse ausgeschlossen werden. Sie schlagen vor, zu verwenden-path
, aber Sie können auch-regex
oder verwenden-iregex
, dh-not -regex '.*/node_modules/.*'
was anode_modules
in jeder Tiefe ausschließt.regex
oderbash
Noob abkomme, aber was ist mit mehreren Ausschlüssen, sagen wirnode_module
unddist
zum Beispiel?-P
Flag ist GNU grep erforderlich . OS X wechselte von GNU grep zu BSD grep. Einige Alternativen für OS X: stackoverflow.com/questions/16658333/…Hier ist eine bessere Option: Swiss File Knife . Es funktioniert rekursiv über Unterverzeichnisse hinweg und behandelt Leerzeichen und Sonderzeichen ordnungsgemäß.
Alles was du tun musst, ist:
Bonus: sfk macht auch viele andere Conversions. Die vollständige Liste finden Sie unten:
BEARBEITEN: Ein Wort der Vorsicht: Seien Sie vorsichtig, wenn Sie dies für Ordner mit Binärdateien ausführen, da dies Ihre Dateien, insbesondere .git-Verzeichnisse, effektiv zerstört . Wenn dies der Fall ist, kann nicht sfk im gesamten Ordner laufen, aber bestimmte Dateierweiterungen wählen statt (* .rb, * Py, etc). Beispiel:
sfk remcr -dir chef -file .rb -file .json -file .erb -file .md
quelle
sfk
ich meinen gesamten .git-Ordner effektiv verarbeitet und eine Reihe von Binärdateien zerstört (daher meine Bearbeitung ; ich erinnere mich nicht, ob es Linux oder Mac war). Möglicherweise haben sie das Standardverhalten in neueren Versionen geändert, aber ich würde trotzdem empfehlen, die Erweiterung anzugeben, um sicher zu gehen.Dies ist viel sicherer, da es verhindert, dass Ihr Git-Repo beschädigt wird. Fügen Sie .git, .svn durch .bzr, .hg oder eine andere Quellcodeverwaltung hinzu oder ersetzen Sie sie zur Nicht- Liste.
quelle
Unter OS X funktionierte dies für mich:
Warnung: Bitte sichern Sie Ihr Verzeichnis, bevor Sie diesen Befehl ausführen.
quelle
Hier eine Lösung bei Verwendung von sed:
-i
steht für In-Place, wenn Sie auch ein Backup erstellen möchten-i.bak
's/\r$//'
ersetzt alle Wagenrückläufe (\r
) am Ende jeder Zeilequelle