Cómo determinar el final de línea de un archivo
-
02-07-2019 - |
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 -uo algo similar en un script para convertir todo, pero quiero poder identificar aquellos archivos que necesitan cambiarse primero.
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 defile
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.