Назад | Перейти на главную страницу

Linux Colorize Найти?

Можно ли «раскрасить» вывод find?

У меня есть находка, которая ищет / home на всех моих серверах и запускает 'rm' определенные файлы. Поскольку они смешаны с другими моими результатами поиска, среди прочего, я хотел бы их раскрасить.

Это возможно?

Чтобы выделить прокручиваемый текст командной строки, я обычно использую эту функцию bash + perl:

highlight() { perl -pe "s/$1/\e[1;31;43m$&\e[0m/g"; }

в качестве таких:

command | highlight "desired text"

С помощью GNU find вы можете использовать -printf вместо того -print для настройки способа печати имени файла. (Вы также можете сделать это стандартным поиском, но окольным путем через -exec sh -c 'echo ...' {}.) Например, следующая команда печатает исполняемые файлы зеленым цветом, а другие обычные файлы - цветом по умолчанию:

find . -type f \( -perm +100 -printf '\033[32m%p\033[0m\n' -or -print \)
find ... | grep -E --color 'words of interest|more good stuff|$'

Знак доллара заставляет его соответствовать концу каждой строки, но ему нечего выделять, поэтому он выводит даже строки без совпадений, выделяя другие элементы, которые вы указали.

Это похоже на ответ @jrods, но для этого не требуется Perl. Это работает с GNU grep, который установлен в Darwin, Linux и FreeBSD.

Вы могли бы использовать grep с цветами и пропустите команду через grep:

export GREP_OPTIONS="--color=auto"

Затем, чтобы выделить текст, просто сделайте что-то вроде этого:

find / -name "perl" |grep "your_string_here"

У меня есть один, который я использую, например, для работы в качестве (с псевдонимом) замены для ls -d */ .*/ это пропускает . и .. каталоги:

найти . -mindepth 1 -maxdepth 1 -type d -exec ls --color = auto -d {} \;

так я получаю не только подсветку, но и тем же система выделения, которая обычно применяется.

Я использую следующую функцию (определенную в ~ /. {Ba, z} shrc):

HLCOLOR="\x1b[30;47m"
NOCOLOR="\x1b[0m"

#Usage: find [dir] [mask1] [mask2]...
#where maskN will become <<-iname '*maskN*'>> param for 'find'
#'dir' should be an existing directory. otherwise it will be recognized as mask.
function findm {
        local it cl sp;
        [ -d "$1" ] && cl="'$1'" && shift;
        for it in "$@"; do
                cl="${cl} -iname '*${it}*' -or";
                sp="${sp}${it}\\|";
        done;   
        cl="${cl%-or}";
        sp="s/\\(${sp%\\|}\\)/${HLCOLOR}\\0${NOCOLOR}/ig";
        eval find ${cl} | sed -e "${sp}";
}

Если цвета в grep включены или автоматически, вы можете просто сделать короткий канал grep с опцией расширенного регулярного выражения и знаком доллара (чтобы по-прежнему отображалась каждая строка).

grep -E 'word|$'

Например, с поиском по каналу:

find . -type f | grep -E 'readme|$'

который будет выделять все случаи "readme" и по-прежнему отображать весь вывод find.

Примечание: Если у grep отключены цвета, вы можете добавить к нему параметр --color (grep -E --color ...), как предлагает Деннис Уильямсон, или установите его для сеанса (export GREP_OPTIONS="--color=auto").