Незначительное расширение отличного ответа Андре .
Неотслеживаемые файлы игнорируются.
if git diff-index --quiet HEAD
then
GIT_MODS="clean"
else
GIT_MODS="dirty"
fi
Ваша вторая попытка, скорее всего, будет улучшена за счет распаковки, иначе каждая итерация цикла будет иметь полные накладные расходы на распаковку — предварительная распаковка будет означать, что у вас будут эти накладные расходы только один раз.
Если это все еще недостаточно быстро, вы также можете попробовать многопоточность (предполагает разархивированный A ).
find B -type f -name 'B*' -print0 \
| xargs -0 -t -n1 -P8 \
grep -f {} A >> C.xml
В этом примере должно выполняться 8 процессов одновременно. Возможно, вам потребуется настроить это значение в зависимости от того, сколько у вас процессоров/ядер.
Я не уверен, каких результатов вы ожидаете в плане скорости; откровенно говоря, похоже, что вы много работаете, а много работы требует времени.