Лимонная плитка может быть одним из способов сделать это. Несмотря на то, что он предназначен для использования в HUD, он может рисовать пустые прямоугольники на экране :
.
# Draw a rectangle on the screen,
# then have it disappear after 3 seconds:
{ echo "" && sleep 3; } | lemonbar -n "my_lemonbar" -g 200x200+40+40 -B '#88000000'
# or for something more persistent
( echo "" | lemonbar -p -n my_lemonbar -g 200x200+40+40 -B '#88000000' ) &
# Then, to remove the box:
pgrep -f "lemonbar.+ -n my_lemonbar"
Попробуйте это,
find./ -type f \( -name filename1.ext -o -name filename2.ext -o -name filename3.ext \) -exec grep 'string' {} \;
-type f
так как вы ищете файлы, лучше указать тип, чтобы быстрее получить результат.
-o
означает ИЛИ, это позволяет вам добавить больше имен файлов в поиск
Вы можете сгруппировать все name
первичные запросы в одном операторе поиска, а затем найти выполнение grep.
find. \( -name filename1.ext -o \
-name filename2.ext -o \
-name filename3.ext \) \
-exec grep 'pattern' {} \;
Использованиеbash
:
shopt -s globstar
grep 'pattern'./**/filename[123].ext
При включенной опции оболочки globstar
шаблон **
ведет себя как *
, но совпадает с /
в путях. Это будет работать, если шаблон не соответствует тысячам файлов, и в этом случае вы, вероятно, получите ошибку «Слишком длинный список аргументов» от оболочки. Это также не проверяет, относятся ли совпадающие пути к обычным файлам или нет, как это сделал бы find
со своим тестом -type f
. Также. если шаблон не соответствует ничему , он останется нераскрытым.
В цикле, который решает все три вышеупомянутые проблемы:
shopt -s globstar
for pathname in./**/filename[123].ext; do
[ -f "$pathname" ] && grep 'pattern' /dev/null "$pathname"
done
Помимо того, что правильным ответом действительно является использование -o
и -exec
, вот общий способ захватить вывод предыдущей команды и проанализировать его построчно
(find.... && find... && cat... && ls... &&...) | while read line; do grep string $line; done
В общем, есть по крайней мере три способа сделать комбинацию find
+ grep
:
grep
шаблон`find
каталогнайти -спецификаторы-print`
find
каталогнайти -спецификаторы-exec grep
шаблон{} \;
find
каталогнайти -спецификаторы-print | xargs grep
шаблонИ, конечно, здесь grep
нет ничего особенного; эти же три шаблона можно использовать для find
плюс любая команда.
Номер 1, в некотором смысле, самый старый и самый простой способ, поскольку обратные кавычки всегда были способом захватить вывод одной команды и использовать его в командной строке другой. (В последнее время у меня сложилось впечатление, что есть более новый башизм, который лучше, чем обратные кавычки, и который используют все крутые ребята, но я думаю, что я старый -таймер. )Недостаток варианта №1 в том, что если find
находит много файлов, может появиться ошибка "Слишком длинная командная строка".
Номер 2 — это специальная функция, встроенная в find
для выполнения комбинации find
+ команда. Пока это хорошо, но у него есть два недостатка:(1 )он повторно -вызывает вспомогательную команду(grep
или что-то еще )для каждого найденного файла, поэтому он может быть медленным, и (2 )если вспомогательной командой является grep
, поскольку каждый вызов grep
видит одно имя файла, он не будет отображать имена файлов в совпадении, хотя вы можете обойти это, выполнив шаблон-exec grep
{} /dev/null \;
или, в наши дни, шаблон-exec grep -H
{} \;
.
И еще есть номер 3. Насколько я знаю, xargs
был изобретен, чтобы обойти ограничения первых двух. Хотя xargs
теоретически является программой общего назначения -, я подозреваю, что на практике она почти никогда не используется с какой-либо парой программ, кроме find
и grep
. Он полностью устраняет недостаток #1; он будет работать с произвольным количеством найденных файлов. Это эффективно, хотя, если вам не повезет, он будет иногда вызывать grep
одно последнее имя файла, а это означает, что вы все равно захотите использовать трюк /dev/null
или -H
. И у него есть свой недостаток :— он не работает, если какое-либо из найденных имен файлов содержит пробелы. Но и это можно обойти:
find
каталогнайти -спецификаторы-print0 | xargs -0 grep
шаблон
(Я бы очень хотел, чтобы xargs
был написан так, чтобы по умолчанию принимать имена файлов, разделенные новой строкой -, вместо пробелов, но это разглагольствования для другого дня.)