Можно ли «раскрасить» вывод 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"
).