2012-05-17 14 views

Respuesta

7

Puede utilizar -i bandera para cambiar los archivos en el lugar de sed:

find . -type f -exec sed -i 's/\x0d//g' {} \+ 

Si yo fuera usted, me gustaría mantener los archivos de un lado para asegurarse de que la operación salió bien. Luego puede eliminar los archivos temporales cuando termine. Esto se puede hacer así:

find . -type f -exec sed -i'.OLD' 's/\x0d//g' {} \+ 
find . -type f -name '*.OLD' -delete 
+0

Esto debería manejar nombres de archivos que contengan espacios en blanco. ¿No agregará una nueva línea al final de cada línea causará que los archivos se espacien a doble espacio, o incluso espacian tres veces (ya que está reemplazando los retornos de carro con líneas nuevas)? Sí, acabo de probarlo. –

+0

@DennisWilliamson Acabo de sacar eso de un guión que tengo en la oficina sin siquiera pensarlo dos veces. Ahora me pregunto cómo funcionan esos scripts. (Podría tener que ver con el hecho de que estaban destinados a convertir archivos creados en Microsoft Office para Mac.) La nueva versión debería funcionar correctamente. –

2

¿Tiene nombres de archivos y nombres de directorios sanos sin espacios, etc. en ellos?

Si es así, no es demasiado difícil. Si tiene que tratar con nombres arbitrarios que contienen nuevas líneas y espacios, etc., entonces tiene que trabajar más duro que esto.

tmp=${TMPDIR:-/tmp}/crlf.$$ 
trap "rm -f $tmp.?; exit 1" 0 1 2 3 13 15 

find . -type f -print | 
while read name 
do 
    tr -d '\015' < $name > $tmp.1 
    mv $tmp.1 $name 
done 

rm -f $tmp.? 
trap 0 
exit 0 

Las trampas aseguran que no obtenga archivos temporales. Hay otros trucos que puede extraer, con más nombres aleatorios para sus nombres de archivos temporales. Normalmente no los necesita a menos que trabaje en un entorno hostil.

+0

Tenga en cuenta que 'tr' en realidad reconoce' \ r' (tanto las variantes BSD como GNU), por lo que puede usar 'tr -d '\ r''. –

11

Para todos los archivos en el directorio actual en que puede hacerlo con un Perl de una sola línea: perl -pi -e 's/\r\n/\n/g' * (robado de here)

EDITAR: Y con una pequeña modificación que puede hacer recursividad subdirectorio:

find | xargs perl -pi -e 's/\r\n/\n/g' 
+2

Si su 'find' y' xargs' lo admiten: 'find -print0 | xargs -0 ... 'manejará nombres de archivo con espacios en blanco. –

+3

Tenga cuidado si usa este comando en el repositorio * Git *. Excluir el subdirectorio '.git' de find. – prajmus

1

También puede usar el editor en modo por lotes.

find . -type f -exec bash -c 'echo -ne "%s/\\\r//\nx\n" | ex "{}" ' \; 
+0

Esta solución fue la única que funcionó para mí en Mac OS X. Los demás se obsesionaron con varios problemas como 'No se puede editar in situ: ./lang no es un archivo normal, <> línea 22167. – WilliamKF

0

Si \r no es seguida por \n (tal vez en el caso de los archivos de Tim Pote):

  • borrar \r (usando tr -d) puede eliminar saltos de línea
  • sustitución de \r con \n no puede causa nuevas líneas dobles/triples

Tal vez Tim Pote podría verificar los puntos anteriores para los archivos que mencionó.

+0

Este me parece un buen comentario sobre la respuesta de Tim Pote, pero no está muy claro cómo responde realmente la pregunta. –

Cuestiones relacionadas