Pregunta

Tengo un montón (cientos) de archivos que se supone que tienen finales de línea Unix.Sospecho firmemente que algunos de ellos tienen finales de línea de Windows y quiero averiguar mediante programación cuáles los tienen.

Sé que puedo simplemente correr

flip -u
o algo similar en un script para convertir todo, pero quiero poder identificar aquellos archivos que necesitan cambiarse primero.

¿Fue útil?

Solución

Podrías usar grep

egrep -l $'\r'\$ *

Otros consejos

Puedes usar el file herramienta, que le indicará el tipo de final de línea.O simplemente podrías usar dos2unix -U que convertirá todo a finales de línea de Unix, independientemente de con qué comenzó.

Algo parecido a:

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

aunque es posible que sea necesario refinar y ordenar parte de esa expresión regular.

Eso generará su archivo con WIN, MAC o UNIX al final de cada línea.Es bueno si su archivo es de alguna manera un desastre terrible (o una diferenciación) y tiene finales mixtos.

Aquí está la respuesta más segura.La respuesta de Stimms no tiene en cuenta subdirectorios y archivos binarios

find . -type f -exec file {} \; | grep "CRLF" | awk -F ':' '{ print $1 }'
  • Usar file para encontrar el tipo de archivo.Aquellos con CRLF tienen caracteres de retorno de Windows.La salida de file está delimitado por un :, y el primer campo es la ruta del archivo.

Unix usa un byte, 0x0A (LineFeed), mientras que Windows usa dos bytes, 0x0D 0x0A (Retorno de carro, avance de línea).

Si nunca ve un 0x0D, es muy probable que sea Unix.Si ve pares 0x0D 0x0A, es muy probable que sea MSDOS.

Windows usa los caracteres 13 y 10 para el final de línea, Unix solo uno de ellos (no recuerdo cuál).Por lo tanto, puede reemplazar los caracteres 13 y 10 por los caracteres 13 o 10 (el que usa Unix).

Cuando sepa qué archivos tienen finales de línea de Windows (0x0D 0x0A o \r \n), ¿qué harás con esos archivos?Supongo que los convertirás en finales de línea de Unix (0x0A o \n).Puede convertir archivos con finales de línea de Windows a finales de línea de Unix con sed utilidad, solo use el comando:

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

Puedes ponerlo en un script como este:

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

Si lo ejecuta desde su directorio raíz con archivos, al final se asegurará de que todos los archivos tengan finales de línea Unix.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top