¿Hay alguna manera de identificar rápidamente los archivos con la terminación de línea de Windows o Unix?

8

Sé que podemos usar dos2unix para convertir entre Windows y la terminación de línea Unix. Me pregunto si hay algún comando que pueda decirme si un archivo tiene la terminación de línea de Windows o Unix.

Oliver
fuente

Respuestas:

11
$ file f1 f2 f3
f1: ASCII text, with CRLF, LF line terminators
f2: ASCII text, with CRLF line terminators
f3: ASCII text

Si considera necesario verificar cada línea del archivo, puede hacer esto:

$ grep -c "^M" f1 f2
f1:0
f2:3

$ wc -l f1 f2
 3 f1
 3 f2
 6 total

La "^ M" se ingresó usando Ctrl + V Ctrl + M y es el carácter de retorno de carro (CR) ASCII.

Aquí vemos que el archivo f1 tiene tres líneas pero no CR, por lo que todas las terminaciones de línea deben ser LF solo de estilo Unix.

El archivo f2 tiene el mismo número de líneas y CR, por lo que es razonable adivinar que usa las terminaciones de línea CR, LF que usan MSDOS y Windows.

RedGrittyBrick
fuente
1
fileno muestra el estado final de la línea si puede encontrar una coincidencia más cercana que ASCII, es decir setup.py: a python script text executable. Parece que A no puede encontrar una bandera para cambiar ese comportamiento.
miracle2k
1
@ miracle2k: Quizás se pueda crear un archivo mágico personalizado para hacer esto. file -m magicfile f1 f2 f3
RedGrittyBrick
1

En Windows, una forma rápida de saberlo es abrir su archivo en el Bloc de notas. El Bloc de notas mostrará saltos de línea solo en terminaciones de estilo de Windows (CR + LF) y no en terminaciones de Unix (LF). Entonces su texto de Unix se verá así:

Line1Line2Line3Line4

mientras que el texto de Windows se verá así:

line1
line2
line3
line4

No estoy muy familiarizado con la plataforma unix / linux, pero estoy seguro de que puedes usar hacks similares con programas como gedit o emacs.

Prahlad Yeri
fuente
0
c=($(perl -0777ne 'print $_ =~ tr/\n//; print " "; 
                   print $_ =~ tr/\r//;'))
if   ((!(c[0] +   c[1]))) ;then echo no line endings  
elif ((  c[0] && !c[1] )) ;then echo LF
elif (( !c[0] &&  c[1] )) ;then echo CR 
elif ((  c[0] ==  c[1] )) ;then echo CRLF 
else echo "anbigious LF ${c[0]} CR ${c[1]}"
fi

Tenga en cuenta, que por causa de la velocidad, sólo individuales \rs y \ns son contados, pero sería un archivo bastante loco que tenía un número igual de ambos tipos y, sin embargo, no era un archivo de Windows CRLF ...

También tenga en cuenta que la herramienta * nix fileno realiza una exploración completa del archivo, mientras que este perlscript sí lo hace. No ha mencionado en qué plataforma desea que se ejecute; He usado bashscript para probar la salida de perl, pero eso se puede cambiar a cmdscript de Windows .

Simplemente puede canalizar su archivo a él.

Peter.O
fuente