2012-05-17 15 views

Antwort

7

können Sie die Nutzung sed -i Flagge, die Dateien an Ort und Stelle zu ändern:

find . -type f -exec sed -i 's/\x0d//g' {} \+ 

Wenn ich Sie wäre, würde ich die Dateien halten um um sicherzustellen, dass der Betrieb in Ordnung ging. Dann können Sie die temporären Dateien löschen, wenn Sie fertig sind. Dies kann so gemacht werden:

find . -type f -exec sed -i'.OLD' 's/\x0d//g' {} \+ 
find . -type f -name '*.OLD' -delete 
+0

Dies sollte mit Dateinamen umgehen, die Leerzeichen enthalten. Fügen Sie am Ende jeder Zeile keine Zeilenumbrüche ein, weil die Dateien doppelt oder sogar dreifach voneinander entfernt sind (da Sie die Zeilenumbrüche durch Zeilenumbrüche ersetzen)? Ja, ich habe es gerade getestet. –

+0

@DennisWilliamson Ich habe das gerade aus einem Drehbuch, das ich im Büro habe, gezerrt, ohne auch nur zweimal darüber nachgedacht zu haben. Jetzt frage ich mich, wie diese Skripte überhaupt funktionieren. (Es könnte damit zu tun haben, dass sie zum Konvertieren von Dateien gedacht waren, die in Microsoft Office für Mac erstellt wurden.) Die neue Version sollte ordnungsgemäß funktionieren. –

2

Haben Sie vernünftige Dateinamen und Verzeichnisnamen ohne Leerzeichen usw. in ihnen?

Wenn ja, ist es nicht zu schwer. Wenn Sie mit beliebigen Namen arbeiten müssen, die Zeilenumbrüche und Leerzeichen enthalten, müssen Sie härter arbeiten.

tmp=${TMPDIR:-/tmp}/crlf.$$ 
trap "rm -f $tmp.?; exit 1" 0 1 2 3 13 15 

find . -type f -print | 
while read name 
do 
    tr -d '\015' < $name > $tmp.1 
    mv $tmp.1 $name 
done 

rm -f $tmp.? 
trap 0 
exit 0 

Das Trap-Material sorgt dafür, dass Sie keine temporären Dateien erhalten. Dort können Sie andere Tricks mit mehr zufälligen Namen für Ihre temporären Dateinamen ziehen. Sie brauchen sie normalerweise nicht, wenn Sie nicht in einer feindlichen Umgebung arbeiten.

+0

Beachten Sie, dass "tr" tatsächlich "\ r" erkennt (sowohl BSD- als auch GNU-Varianten), so dass Sie 'tr -d '\ r'' verwenden können. –

11

Für alle Dateien im aktuellen Verzeichnis, das Sie es mit einem Perl-Einzeiler tun können: perl -pi -e 's/\r\n/\n/g' * (bestohlen here)

EDIT: Und mit einer kleinen Modifikation können Sie Unterverzeichnis Rekursion tun:

find | xargs perl -pi -e 's/\r\n/\n/g' 
+2

Wenn deine 'find' und' xargs' es unterstützen: 'finde -print0 | xargs -0 ... 'behandelt Dateinamen mit Leerzeichen. –

+3

Achten Sie darauf, ob Sie diesen Befehl im * Git * Repository verwenden. Schließen Sie das '.git'-Unterverzeichnis von find aus. – prajmus

1

Sie können den Editor auch im Stapelmodus verwenden.

find . -type f -exec bash -c 'echo -ne "%s/\\\r//\nx\n" | ex "{}" ' \; 
+0

Diese Lösung war die einzige, die für mich unter Mac OS X funktionierte. Die anderen haben auf verschiedene Probleme wie 'Inplace bearbeiten nicht auflegen: ./lang ist keine reguläre Datei, <> Zeile 22167. ' – WilliamKF

0

Wenn \r nicht durch \n (vielleicht der Fall in den Akten von Tim Pote) gefolgt:

  • \r Löschen (mit tr -d) Zeilenumbrüche entfernen
  • \r mit \n ersetzen kann nicht Ursache Doppel/Dreifach-Zeilenumbrüche

Vielleicht könnte Tim Pote die obigen Punkte für die von ihm erwähnten Dateien überprüfen.

+0

This Für mich ist das ein guter Kommentar zu Tim Potes Antwort, aber es ist nicht klar, wie sie die Frage beantwortet. –