2009-05-15 9 views
20

Si jeConserver ls coloration après grep'ing

$ ls -l --color=always 

-je obtenir une liste de fichiers à l'intérieur du répertoire avec une coloration agréable pour différents types de fichiers, etc ..

Maintenant, je veux être capable de canaliser la sortie colorée de ls à grep pour filtrer certains fichiers dont je n'ai pas besoin. La clé est que je veux toujours préserver la coloration après le filtre grep.

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

^je perds la coloration après grep

EDIT: J'utilise serveur sans tête Ubuntu 8.10, Bash 3.2.39, à peu près un stock d'installation sans configs fantaisie

+0

FWIW ça marche pour moi. Cela pourrait avoir quelque chose à voir avec l'émulateur de terminal que vous utilisez. – Anonymous

Répondre

45

Votre grep supprime probablement les codes couleurs de ls car il a sa propre coloration activée.

Vous "pouvez" faire ceci:

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

Cependant, il est très important que vous compreniez ce que vous êtes exactement grep ping ici. Non seulement grep ping ls inutile (utilisez un glob à la place), ce cas particulier est grep ping à travers non seulement les noms de fichiers et les statistiques du fichier, mais aussi à travers les codes de couleurs ajoutés par ls!

La vraie réponse à votre question est: Ne pas grep il. Il n'est jamais nécessaire de canaliser ls dans quelque chose ou capturer sa sortie. ls est uniquement destiné à l'interprétation humaine (par exemple à regarder dans un interactif shell seulement, et à cet effet, il est extrêmement pratique, bien sûr). Comme mentionné précédemment, vous pouvez filtrer les fichiers ls énumère en utilisant globs:

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) 

Je très vous recommandons de lire ces deux excellents documents en la matière:

+2

Comme d'habitude, codage shell sur les niveaux supérieurs (et sains). ++ – TheBonsai

+0

+1, super explication, et ce sont vraiment de bons liens! – Andy

+0

@lhunath Je n'ai jamais réalisé à quel point une telle pratique pouvait être, merci pour les liens et bien que j'utilise une regex avancée je vais essayer de migrer ça vers glob et d'utiliser nativement dans 'ls' – duckyflip

0

Vous devriez vérifier si vous utilisez réellement les ls « vrais », tout en appelant directement le binaire:

/bin/ls .... 

Parce que: le code que vous avez décrit doit vraiment travailler, à moins que ls ne tient pas compte --color = toujours si moi une raison ou un bug étrange.

Je soupçonne un alias ou une fonction qui ajoute (directement ou via une variable) certaines options. Revérifiez que ce n'est pas le cas.

Questions connexes