Использование grep после использования find для получения файлов

Лимонная плитка может быть одним из способов сделать это. Несмотря на то, что он предназначен для использования в 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"

4
27.06.2018, 20:09
5 ответов

Попробуйте это,

find./ -type f \( -name filename1.ext -o -name filename2.ext -o -name filename3.ext \) -exec grep 'string' {} \;
  • -type fтак как вы ищете файлы, лучше указать тип, чтобы быстрее получить результат.

  • -oозначает ИЛИ, это позволяет вам добавить больше имен файлов в поиск

3
27.01.2020, 20:48

Вы можете сгруппировать все nameпервичные запросы в одном операторе поиска, а затем найти выполнение grep.

find. \( -name filename1.ext -o \
      -name filename2.ext -o \
      -name filename3.ext \) \
      -exec grep 'pattern' {} \;
6
27.01.2020, 20:48

Использование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
0
27.01.2020, 20:48

Помимо того, что правильным ответом действительно является использование -oи -exec, вот общий способ захватить вывод предыдущей команды и проанализировать его построчно

(find.... && find... && cat... && ls... &&...) | while read line; do grep string $line; done
1
27.01.2020, 20:48

В общем, есть по крайней мере три способа сделать комбинацию find+ grep:

  1. grepшаблон`findкаталогнайти -спецификаторы-print`
  2. findкаталогнайти -спецификаторы-exec grepшаблон{} \;
  3. 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был написан так, чтобы по умолчанию принимать имена файлов, разделенные новой строкой -, вместо пробелов, но это разглагольствования для другого дня.)

0
27.01.2020, 20:48

Теги

Похожие вопросы