it-swarm-eu.dev

Jak určit ukončení řádku souboru

Mám spoustu (stovek) souborů, které mají mít konce řádků Unixu. Velmi se domnívám, že některé z nich mají konce řádků systému Windows, a chci programově zjistit, které z nich fungují.

Vím, že můžu běžet 

flip -u
nebo něco podobného ve skriptu převést všechno, ale chci být schopen identifikovat ty soubory, které je třeba změnit jako první.

50
nwahmaet

Můžete použít grep

egrep -l $'\r'\$ *
28
stimms

Můžete použít nástroj file , který vám řekne typ konce řádku. Nebo můžete použít dos2unix -U, které převede vše na koncové řádky Unixu, bez ohledu na to, s čím začalo.

67
Adam Rosenfield

Něco v duchu:

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

ačkoli někteří to regexp může potřebovat rafinovat a uklízet.

Na konci každého řádku bude váš soubor s výstupem WIN, MAC nebo UNIX. Dobrá, pokud je váš soubor nějak strašným nepořádkem (nebo rozdílem) a má smíšené konce.

14
joachim

Tady je ta nejbezpečnější odpověď. Stimms odpověď není účet pro podadresáře a binární soubory

find . -type f -exec file {} \; | grep "CRLF" | awk -F ':' '{ print $1 }'
  • Pro nalezení typu souboru použijte file. Ti s CRLF mají okna vrátit znaky. Výstup file je ohraničen : a první pole je cesta k souboru.
4
Bryce Guinta

Unix používá jeden bajt 0x0A (LineFeed), zatímco okna používají dva bajty 0x0D 0x0A (Carriage Return, Line feed).

Pokud nikdy nevidíte 0x0D, pak je to pravděpodobně Unix. Pokud vidíte 0x0D 0x0A páry, pak je to velmi pravděpodobné MSDOS.

3
Adam Davis

Windows používá znak char 13 & 10 pro konec řádku, unix pouze jeden z nich (nemám remizber, který z nich). Takže můžete nahradit char 13 a 10 pro char 13 nebo 10 (ten, který používá unix).

0
TcKs

Když víte, které soubory mají konce řádků Windows (0x0D 0x0A nebo \r \n), co s těmito soubory budete dělat? Myslím, že je převedete na konce unixových řádků (0x0A nebo \n). Soubor s koncovkami řádků systému Windows můžete konvertovat na koncové řádky Unixu pomocí nástroje sed, stačí použít příkaz:

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

Můžete to vložit do skriptu takto:

#!/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

Pokud jej spouštíte ze svého kořenového adresáře se soubory, na konci budete mít jistotu, že všechny soubory jsou zakončeny řádky Unixu.

0
1ac0