Я бы сделал это наоборот:
printf '%s\0' *.xml | xargs -0 grep -lFf ../Identifiers.list
Это проверит каждый файл только один раз и остановится, как только совпадение будет найдено.-F
использует фиксированное сопоставление строк вместо регулярных выражений, что должно еще больше ускорить процесс.
Я думаю, что ваш подход неявно использует -L 1
(из-за -i
), поэтому для каждой строки Identifier.list
, он просматривает все файлы.
Потенциально еще быстрее с распараллеливанием, например, с четырьмя параллельными процессами:
printf '%s\0' *.xml | xargs -0 -P 4 grep -lFf ../Identifiers.list
Для еще большего ускорения, если ваши файлы ASCII, вы можете использовать LC_ALL=C
:
printf '%s\0' *.xml | LC_ALL=C xargs -0 -P 4 grep -lFf ../Identifiers.list
Использование xargs
- хорошая идея, хотя даже без распараллеливания: прямое использование grep, как в
grep -lFf ../Identifiers.list *.xml
, может привести к ошибке, поскольку*.xml
расширяется до слишком длинной командной строки.