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"
).