Wie konvertiere ich alle Dateien in einem Dateisystemzweig zwischen dem Unix- und dem Windows-Zeilenumbruchformat?

14

Jeder weiß :-), dass in Windows-Nur-Text-Dateien Zeilen mit CR + LF und in Unix & Linux mit LF abgeschlossen werden. Wie kann ich alle meine Quellcode-Dateien schnell von einem Format in ein anderes und zurück konvertieren?

Ivan
quelle

Antworten:

17

Das hängt davon ab: Wenn sich die Dateien unter Versionskontrolle befinden, kann dies eine eher unpopuläre Entscheidung sein, die den Verlauf des Programms belastet. Git hat die Option, Zeilenenden beim Auschecken automatisch umzuwandeln.

Wenn es Ihnen egal ist und Sie schnell konvertieren möchten, gibt es Programme wie fromdos/ todosund dos2unix/ unix2dos, die dies für Sie tun. Sie können verwendet werden find: find . -type f -name '*.php' -exec dos2unix '{}' +.

janmoesen
quelle
7

Es gibt mehrere spezielle Programme, darunter

  • dos2unixund unix2dosaus den dos2unix tools
  • todosund fromdosvon den Tofrodos- Werkzeugen

Wählen Sie einfach das Werkzeug für die entsprechende Richtung aus und übergeben Sie die Namen der zu konvertierenden Dateien in der Befehlszeile.


Wenn Sie beides nicht haben, aber Linux oder Cygwin haben:

sed -i -e 's/\r\+$//' filename             # dos|unix -> unix
sed -i -e 's/\r*$/\r/' filename            # dos|unix -> dos

Wenn Sie Perl haben:

perl -i -pe 's/\r+$//' filename            # dos|unix -> unix
perl -i -pe 's/\r*$/\r/' filename          # dos|unix -> dos

Mit nur POSIX-Tools (einschließlich BusyBox) müssen Sie das CR-Zeichen im sed-Befehl buchstäblich übergeben, um von Unix zu DOS zu wechseln.

cr=$(echo | tr '\n' '\r')
sed -e "s/$cr*\$/$cr/" <filename >filename.dos
mv filename.dos filename

In der anderen Richtung können Sie einfach alle CRs löschen:

tr -d '\r' <filename >filename.dos
mv filename.dos filename

Sie können Platzhalter verwenden, um mehrere Dateien im selben Verzeichnis gleichzeitig zu konvertieren, z

sed -i -e 's/\r\+$//' *.txt

Um alle Dateien im aktuellen Verzeichnis und seinen Unterverzeichnissen zu konvertieren, können Sie, wenn Ihre Shell zsh ist **/, z

sed -i -e 's/\r\+$//' **/*.txt

Sie können **/in bash ≥4 verwenden, müssen jedoch shopt -s globstarzuerst ausgeführt werden (Sie können diese Zeile in Ihre einfügen ~/.bashrc). Sie können **/in ksh93 verwenden, müssen aber set -o globstarzuerst ausgeführt werden (Sie können diese Zeile in Ihre einfügen ~/.kshrc.

Wenn Sie nur die Tools verwenden können, für die eine Umleitung erforderlich ist, verwenden Sie eine forSchleife.

for x in *.txt; do
  tr -d '\r' <"$x" >"$x.dos"
  mv -- "$x.dos" "$x"
done

Wenn Sie keine **/komplexeren Übereinstimmungen benötigen, um auszuwählen, welche Dateien konvertiert werden sollen, verwenden Sie den findBefehl. Hier ist ein Linux / Cygwin-Beispiel, das alle Dateien im aktuellen Verzeichnis und seinen Unterverzeichnissen rekursiv konvertiert, mit Ausnahme der aufgerufenen Dateien .ound der aufgerufenen Unterverzeichnisse bin.

find -name 'bin' -type d -prune -o \
     \! -name '*.o' \
     -exec sed -i -e 's/\r\+$//' {} +

Hier ist ein POSIX-Beispiel. Wir sagen find, eine Shell zu starten, die die notwendige Umleitung durchführen kann.

find -name 'bin' -type d -prune -o \
     \! -name '*.o' \
     -exec sh -c '
       tr -d '\r' <"$0" >"$0.dos"
       mv -- "$0.dos" "$0"
' {} \;

Sie können die findMethode auf Kosten von komplexerem Code etwas beschleunigen, indem Sie eine Schleife im Shell-Befehl verwenden.

find -name 'bin' -type d -prune -o \
     \! -name '*.o' \
     -exec sh -c '
       for x; do
         tr -d '\r' <"$x" >"$x.dos"
         mv -- "$x.dos" "$x"
       done
' _ {} +
Gilles 'SO - hör auf böse zu sein'
quelle
2

Winscp wird auch automatisch konvertieren, wenn Sie dazu aufgefordert werden .

Wenn sich Ihre Dateien alle im selben Verzeichnis befinden:

DIRECTORY=/your/directory
unix2dos $DIRECTORY/*
Nils
quelle
Können Sie uns bitte etwas näher erläutern, wie Sie mit WinSCP etwas erreichen können?
Harish Sharma
@harishsharma Ich fügte einen Link oben zu "so erzählt" hinzu.
Nils