Linux Colorize Найти?

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

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

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

7 ответов

Решение

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

find . -type f \( -perm +100 -printf '\033[32m%p\033[0m\n' -or -print \)

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

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

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

command | highlight "desired text"

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 с опцией extended-regexp и знаком доллара (чтобы по-прежнему отображать каждую строку).

grep -E 'word|$'

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

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

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

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

Другие вопросы по тегам