Domanda

Ho un sacco (centinaia) di file che dovrebbero avere terminazioni di linea Unix. Sospetto fortemente che alcuni di essi abbiano terminazioni di linea di Windows e voglio capire a livello di codice quali lo fanno.

So che posso semplicemente eseguire

flip -u
o qualcosa di simile in uno script per convertire tutto, ma voglio essere in grado di identificare quei file che devono prima essere modificati.

È stato utile?

Soluzione

Puoi usare grep

egrep -l \r'\$ *

Altri suggerimenti

Puoi utilizzare lo strumento , che ti dirà il tipo di fine riga. Oppure, puoi semplicemente usare dos2unix -U che convertirà tutto in terminazioni di linea Unix, indipendentemente da ciò con cui è iniziato.

Qualcosa sulla falsariga di:

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

anche se alcuni di questi regexp potrebbero aver bisogno di essere perfezionati e riordinati.

Questo produrrà il tuo file con WIN, MAC o UNIX alla fine di ogni riga. Buono se il tuo file è in qualche modo un disastro terribile (o un diff) e ha finali misti.

Ecco la risposta più sicura. La risposta agli stimoli non tiene conto delle sottodirectory e dei file binari

find . -type f -exec file {} \; | grep "CRLF" | awk -F ':' '{ print $1 }'
  • Usa file per trovare il tipo di file. Quelli con CRLF hanno caratteri di ritorno a Windows. L'output di file è delimitato da un : e il primo campo è il percorso del file.

Unix utilizza un byte, 0x0A (LineFeed), mentre Windows utilizza due byte, 0x0D 0x0A (ritorno a capo, avanzamento riga).

Se non vedi mai uno 0x0D, è molto probabile che Unix. Se vedi coppie 0x0D 0x0A, è molto probabile che MSDOS.

Windows usa char 13 & amp; 10 per la fine della linea, unix solo uno di essi (non ricordo quale). Quindi puoi sostituire char 13 & amp; 10 per char 13 o 10 (quello, che usa unix).

Quando sai quali file hanno terminazioni di linea di Windows ( 0x0D 0x0A o \ r \ n ), cosa farai con quei file? Suppongo che li convertirai in estremità di linea Unix ( 0x0A o \ n ). Puoi convertire il file con i finali di linea di Windows in finali di linea Unix con l'utilità sed , basta usare il comando:

#!/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
gt; sed -i 's/\r//' my_file_with_win_line_endings.txt

Puoi inserirlo nello script in questo modo:

<*>

Se lo esegui dalla tua directory principale con i file, alla fine sarai sicuro che tutti i file hanno terminazioni di linea Unix.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top