2009-05-15 10 views
20

Si hagoPreservar ls colorear después grep'ing

$ ls -l --color=always 

puedo obtener una lista de archivos dentro del directorio con un poco de buen color para diferentes tipos de archivos, etc ..

Ahora, quiero estar capaz de canalizar la salida coloreada de ls a través de grep para filtrar algunos archivos que no necesito. La clave es que todavía quiero preservar el color después del filtro grep.

$ ls -l --color=always | grep -E some_regex 

^yo no pierda el color después de grep

EDIT: Estoy usando sin cabeza-servidor de Ubuntu 8.10, Bash 3.2.39, más o menos instalar un archivo sin configuraciones de lujo

+0

FWIW funciona para mí. Podría tener algo que ver con el emulador de terminal que está utilizando. – Anonymous

Respuesta

45

Su grep probablemente esté eliminando los códigos de color de ls porque tiene su propia coloración activada.

usted "podría" hacer esto:

ls -l --color=always | grep --color=never pattern 

Sin embargo, es muy importante que entienda exactamente lo que estás grep de ping aquí. No solo es grep ping ls innecesario (use un glob en su lugar), este caso particular es grep ping no solo a través de nombres de archivos y estadísticas de archivos, sino también a través de los códigos de color agregados por ls.

La verdadera respuesta a su pregunta es: No lo haga grep. Nunca es necesario conectar el ls a nada ni capturar su salida. ls solo está destinado a la interpretación humana (por ejemplo, mira en interactiva solo shell, y para este propósito es extremadamente útil, por supuesto). Como se mencionó antes, puede filtrar qué archivos ls enumera mediante el uso de globos:

ls -l *.txt  # Show all files with filenames ending with `.txt'. 
ls -l !(foo).txt # Show all files with filenames that end on `.txt' but aren't `foo.txt'. (This requires `shopt -s extglob` to be on, you can put it in ~/.bashrc) 

I altamente recomiendo que lea estos dos excelentes documentos sobre la materia:

+2

Como es habitual, la codificación de shell en niveles superiores (y sensatos). ++ – TheBonsai

+0

+1, gran explicación, ¡y esos son realmente buenos enlaces! – Andy

+0

@lhunath Nunca me di cuenta de lo mala que puede ser esta práctica, gracias por los enlaces y aunque estaba usando algunos regex avanzados, intentaré migrarlos para usarlos de forma nativa dentro de 'ls' – duckyflip

0

Usted debe comprobar si realmente están utilizando los ls "reales", con sólo llamar directamente el binario:

/bin/ls .... 

Porque: el código que ha descrito realmente debería funcionar, a menos que ignora ls -color = siempre durante tanto mi extraña razón o error.

Sospecho que algunos alias o funciones agregan (directamente o a través de una variable) algunas opciones. Verifique que este no es el caso.