Сохранить окраску ls после grep'ирования

If I do

$ ls -l --color=always

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

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

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

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

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


person duckyflip    schedule 15.05.2009    source источник
comment
FWIW это работает для меня. Это может быть связано с эмулятором терминала, который вы используете.   -  person Anonymous    schedule 15.05.2009


Ответы (2)


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

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

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

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

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

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)

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

person lhunath    schedule 15.05.2009
comment
Как обычно, шелл-кодирование на более высоком (и разумном) уровне. ++ - person TheBonsai; 15.05.2009
comment
@lhunath Я никогда не осознавал, насколько плохой может быть такая практика, спасибо за ссылки, и хотя я использовал некоторые расширенные регулярные выражения, я попытаюсь перенести их в glob и использовать изначально внутри ls - person duckyflip; 15.05.2009
comment
спасибо, что открыли мне глаза на это. Обычно я запускаю find и смотрю, что получается, прежде чем передать результаты xargs ‹something› - person jpswain; 27.01.2011
comment
@orange80: Не направлять вывод find(1) в xargs(1). xargs — это сломанный инструмент, поскольку он пытается быть умным и ломает имена ваших входных файлов там, где есть пробелы и кавычки. Никто никогда не должен использовать xargs (за исключением редкого случая, когда вы используете -0, у которого почти всегда есть лучшие альтернативы). Вместо этого просто используйте команду find -exec {} +. Он делает то же самое, что и xargs, за исключением того, что он не изнасилует ваши имена файлов (и у вас нет конвейера + дополнительный синтаксический анализ + дополнительные накладные расходы). - person lhunath; 27.01.2011
comment
Хороший. Насколько я знаю, невозможно использовать glob для фильтрации символических ссылок, как в этом примере: ls -l --color=always /dev/disk/by-uuid/ | grep --color=never sda - person A.D.; 23.10.2014
comment
@ОБЪЯВЛЕНИЕ. Вы можете фильтровать символические ссылки с помощью шаблонов zsh glob! ls *(@) перечисляет все символические ссылки, а ls *(^@) перечисляет все несимволические ссылки. - person SilverWolf; 24.09.2018

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

/bin/ls ....

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

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

person TheBonsai    schedule 15.05.2009