Frage

Ich habe eine Reihe (Hunderte) von Dateien, die angeblich Unix-Zeilenende haben. Ich vermute stark, dass einige von ihnen Windows-Zeilenenden haben, und ich möchte programmatisch herauszufinden, welche diejenigen tun.

Ich weiß, ich kann einfach laufen

flip -u
oder etwas ähnliches in einem Skript alles zu konvertieren, aber ich möchte in der Lage sein, diese Dateien zu identifizieren, die zuerst gewechselt werden müssen.

War es hilfreich?

Lösung

könnten Sie verwenden grep

egrep -l $'\r'\$ *

Andere Tipps

Sie können das file Tool, mit dem Sie die Art der Linie erzählen Ende. Oder Sie könnten nur dos2unix -U verwenden, die alles auf Unix-Zeilenende konvertieren, unabhängig davon, was es begann mit.

Etwas entlang der Linien von:

perl -p -e 's[\r\n][WIN\n]; s[(?<!WIN)\n][UNIX\n]; s[\r][MAC\n];' FILENAME

obwohl einige dieser regexp kann Raffinierung benötigen und aufzuräumen.

Das wird ausgegeben Ihre Datei mit WIN, MAC oder UNIX am Ende jeder Zeile. Gut, wenn Sie Ihre Datei irgendwie eine schreckliche Chaos (oder ein diff) und hat Endungen gemischt.

Hier ist die ausfallsichere Antwort. Stimms für Doesn Konto beantworten Verzeichnisse und Binär-Dateien

find . -type f -exec file {} \; | grep "CRLF" | awk -F ':' '{ print $1 }'
  • Verwenden Sie file Dateityp zu finden. Diejenigen mit CRLF haben Fenster Zeichen zurück. Der Ausgang der file wird durch eine : begrenzt, und das erste Feld ist der Pfad der Datei.

Unix verwendet ein Byte, 0x0A (Zeilenvor), während Fenster zwei Bytes verwendet, 0x0D 0x0A (Carriage Return, Line Feed).

Wenn Sie noch nie einen 0x0D sehen, dann ist es sehr wahrscheinlich, Unix. Wenn Sie 0x0D 0x0A Paare sehen, dann ist es sehr wahrscheinlich, dass MS-DOS.

Windows-Anwendung char 13 & 10 für Zeilenende, Unix nur einer von ihnen (i rememeber nicht, welche). So können Sie ersetzen char 13 & 10 für char 13 oder 10 (derjenige, der Unix verwenden).

Wenn Sie wissen, welche Dateien haben Endungen Windows-Linie (0x0D 0x0A oder \r \n), was Sie tun werden, damit Dateien? Ich nehme an, Sie sie in Unix-Zeilenende (0x0A oder \n) konvertieren. Sie können Datei mit Windows-Zeilenenden in Unix-Zeilenende mit sed Dienstprogramm konvertieren, nur Befehl:

$> sed -i 's/\r//' my_file_with_win_line_endings.txt

Sie können es in Skript setzen wie folgt aus:

#!/bin/bash

function travers()
{
    for file in $(ls); do
        if [ -f "${file}" ]; then
            sed -i 's/\r//' "${file}"
        elif [ -d "${file}" ]; then
            cd "${file}"
            travers
            cd ..
        fi
    done
}

travers

Wenn Sie es von Ihrem Root-Verzeichnis mit Dateien ausführen, am Ende werden Sie sicher sein, alle Dateien mit Unix-Zeilenenden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top