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?
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?
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
/ todos
und dos2unix
/ unix2dos
, die dies für Sie tun. Sie können verwendet werden find
: find . -type f -name '*.php' -exec dos2unix '{}' +
.
Es gibt mehrere spezielle Programme, darunter
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 globstar
zuerst ausgeführt werden (Sie können diese Zeile in Ihre einfügen ~/.bashrc
). Sie können **/
in ksh93 verwenden, müssen aber set -o globstar
zuerst 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 for
Schleife.
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 find
Befehl. Hier ist ein Linux / Cygwin-Beispiel, das alle Dateien im aktuellen Verzeichnis und seinen Unterverzeichnissen rekursiv konvertiert, mit Ausnahme der aufgerufenen Dateien .o
und 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 find
Methode 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
' _ {} +
Winscp wird auch automatisch konvertieren, wenn Sie dazu aufgefordert werden .
Wenn sich Ihre Dateien alle im selben Verzeichnis befinden:
DIRECTORY=/your/directory
unix2dos $DIRECTORY/*