Поиск файлов с помощью gnu parallel

Я понимаю, что с помощью следующей команды

find . -name "*.foo" | parallel grep bar

будет выполняться в 2 шага:

1) выполнить поиск всех файлов, соответствующих "*.foo" .

2) Затем в этом наборе файлов он будет выполнять параллельный поиск, чтобы найти индексную «полосу» внутри файлов.

Но возможно ли распараллелить и сам первый шаг?


person Abhinav Jain    schedule 11.09.2017    source источник


Ответы (2)


Если вы действительно думаете, что ваши диски способны к параллельному поиску и поиску, вы можете сделать это:

printf "%s\0" */ | parallel -0 'find {} -name "*foo" | parallel grep bar'

Запускать полный процесс grep для каждого файла тоже не очень разумно. Вам следует рассмотреть возможность использования параметра -X GNU Parallel, чтобы позволить каждому процессу grep искать несколько файлов.

person Mark Setchell    schedule 11.09.2017
comment
@AbhishekJain Вопросы и ответы бесплатны. Пожалуйста, просто задайте новый вопрос, и вы, скорее всего, получите более качественный ответ, чем прикрепляя его в конце другого вопроса, поскольку его увидит больше людей. Обязательно добавьте ссылку сюда для справки. Спасибо. - person Mark Setchell; 20.07.2020

BLUF: канал | используется для запуска команды на выходе предыдущей команды.

Здесь out of find — это список файлов, и grep может работать параллельно с каждым файлом. если вы измените порядок, то вывод grep будет списком строк, содержащих вашу строку. и найти не будет работать на этом выходе.

Вы можете сделать это в одной команде:

grep -R --include="foo*" "bar" /path/to/directory
  • -R означает рекурсивный, поэтому он попадет в подкаталоги каталога, который вы просматриваете.
  • --include="*.c" означает "искать файлы, оканчивающиеся на .c"
  • "bar" - это шаблон, который вы ищете
  • /path/to/directory — это путь к каталогу, через который вы хотите выполнить grep.
person ggupta    schedule 11.09.2017
comment
Да, я понимаю это. Но есть ли замена команде find, которая будет выполнять первый запрос также параллельно, то есть искать строку *.foo в нескольких именах файлов одновременно? - person Abhinav Jain; 11.09.2017
comment
если файлы типа foo* находятся в одном каталоге, тогда grep -rn -l "bar" будет работать - person ggupta; 11.09.2017