2012-06-26 26 views
14

Estoy buscando un comando bash para buscar archivos con espacios al final de cada línea. No estoy interesado en eliminar los espacios, sino solo en encontrar los archivos.Bash: buscar archivos con espacios al final de las líneas

+2

Nota: Aunque el texto de la pregunta (a partir de este escrito) llama sin ambigüedades para la búsqueda de archivos con espacios finales en _each y cada línea_, la inusualidad de este requisito ha dado lugar a algunas respuestas, especialmente la que tiene más votos, en cambio, busca archivos con _una o más_ líneas con espacios finales. – mklement0

+0

sed -n '/ \ + $/p' nombre de archivo – Luv33preet

Respuesta

1

Buscar archivos con uno o más caracteres de espacio:

find . -name "*" | xargs egrep ".* +$" 
+0

Creo que la pregunta original era encontrar archivos que tienen espacios finales en TODAS las líneas. Sin embargo, podría ser una mala redacción original. – Nit

+0

@Nit dice claramente en el cuerpo, debe haber pasado por alto eso, pero el encabezado de la pregunta puede ser ambiguo. – matcheek

+0

Expandiendo en su solución, 'egrep -m1 -v -l". * + $ "' Debería encontrar todos los archivos que ** no ** tienen espacios finales en cada línea, si no me equivoco? – Nit

25

buscar los archivos que ha espacios finales.

find . -type f -exec egrep -l " +$" {} \; 
+0

Mientras puede hacer con solo 'grep', como han demostrado otras respuestas, usar' find' puede ser una buena idea, si quieres tener más control sobre qué archivos examinar, puedes hacer que el comando 'find' sea mucho más eficiente al usar' + 'en lugar de' \; 'para terminar el primario' -exec' - esto invocará 'egrep' (típicamente) solo _once_, con _todos los nombres de archivos. – mklement0

+0

Tenga en cuenta que esta respuesta encuentra archivos con _al menos 1_ línea con tra iling espacios. Esto definitivamente puede ser útil y es probablemente el caso de uso más común, pero no es lo que el OP solicitó (al menos como lo implica su fraseología, "al final de cada línea"). – mklement0

8

Si el objetivo es hacer una lista de archivos que se arrastran espacios en blanco en una o más líneas:

grep -r '[[:blank:]]$' . 

para no imprimir las líneas, e imprimir sólo los nombres de archivo sólo, especifique también la opción -l . Eso es l como en la palabra list, no el número 1.

+1

la pregunta dice "al final de ** cada ** línea" – Sorin

+1

@Sorin Voy a adivinar que no era exactamente la intención del OP, pero admitiré que la pregunta realmente dice eso, tomado literalmente ... – twalberg

+0

@twalberg, es lo que lo convierte en una pregunta no trivial, que valdría la tercera respuesta casi idéntica – Sorin

1

Hay una opción para listar los archivos que no contienen ninguna coincidencia en ninguno de ellos; usa eso y una expresión regular para un personaje que no sea un espacio justo antes del final de la línea.

grep -L '[^ ]$' * 

Para recurse directorios, agregue -r. Para buscar otros caracteres de espacio en blanco también, utilice una clase de caracteres $'[^ \t]$' o POSIX '[^[:blank:]]$' para la expresión regular.

+0

Bien hecho. Esto realmente solo devuelve archivos TODAS las líneas tienen espacios finales, con una excepción: los archivos _empty_ (cero bytes) también coinciden. Además, el uso de '*' (sin '-r') dará como resultado advertencias para los subdirectorios, en su caso. '-L' no es compatible con POSIX, pero es ampliamente compatible, dado que tanto GNU grep como BSD lo implementan. – mklement0

+1

@ mklement0 Buena captura sobre los archivos de tamaño cero. Puede usar '-s' para suprimir advertencias sobre directorios, o usar' -r .' si desea recorrer un árbol de directorios completo (el OP no era específico de la tarea). – tripleee

0

Si la pregunta es, literalmente, para encontrar los archivos que tienen un espacio en blanco al final de cada línea, entonces esto debería funcionar:

grep -rL '[^[:blank:]]$' . 

El -L dice grep reportar cada archivo que no coincide con el patrón , y el patrón busca líneas que no tengan un espacio en blanco inmediatamente anterior a la nueva línea.

0

Usando ack (o ag):

ack -l ' \n' 

Nota: Al igual que algunas de las otras respuestas, esto mostrará los archivos que contienen uno o más líneas con espacios finales.

1

Si el objetivo es archivos de lista con espacios en blanco en la ruta actual:

grep -rli '[[:blank:]]$' . 
Cuestiones relacionadas