Сохранить окраску ls после grep'ing - PullRequest
23 голосов
/ 15 мая 2009

Если я делаю

$ ls -l --color=always

Я получаю список файлов внутри каталога с приятной раскраской для разных типов файлов и т. Д.

Теперь я хочу иметь возможность передать цветной вывод от ls до grep, чтобы отфильтровать некоторые файлы, которые мне не нужны. Ключ в том, что я все еще хочу сохранить цвет после фильтра grep.

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

^ Я теряю окраску после grep

РЕДАКТИРОВАТЬ: я использую безголовый сервер Ubuntu 8.10, Bash 3.2.39, в значительной степени стандартная установка без каких-либо необычных настроек

Ответы [ 2 ]

49 голосов
/ 15 мая 2009

Ваш grep, вероятно, удаляет цветовые коды ls, потому что у него включена собственная окраска.

Вы могли бы сделать это:

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

Однако очень важно, чтобы вы понимали, что именно вы grep пингуете здесь. Не только grep ping ls не требуется (используйте glob вместо этого), в данном конкретном случае grep пингует не только имена файлов и статистику файлов, но и коды цветов, добавленные ls!

Реальный ответ на ваш вопрос таков: не grep. Нет необходимости направлять ls во что-либо или захватывать его результаты. ls предназначен только для интерпретации человеком (например, взгляд только в интерактивной оболочке, и для этой цели он, конечно, очень удобен). Как упоминалось ранее, вы можете отфильтровать, какие файлы ls перечисляет, используя 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)

Я очень рекомендую прочитать два превосходных документа по этому вопросу:

0 голосов
/ 15 мая 2009

Вы должны проверить, действительно ли вы используете "настоящие" ls, просто вызвав двоичный файл:

/bin/ls ....

Потому что: код, который вы описали, действительно должен работать, если ls не игнорирует --color = всегда по какой-то странной причине или ошибке.

Я подозреваю, что какой-то псевдоним или функция добавляет (напрямую или через переменную) некоторые параметры. Еще раз проверьте, что это не так.

...