Многие версии grep имеют опции для рекурсии, указания шаблона имени файла и т. Д.
grep --perl-regexp --recursive --include='*.py' --regexp="$1" .
Это повторяется, начиная с текущего каталога (.), Просматривает только файлы, заканчивающиеся на 'py', использует регулярные выражения в стиле Perl.
Если ваша версия grep не поддерживает --recursive и --include, то вы все равно можете использовать find и xargs, но не забудьте разрешить имена путей со встроенными пробелами, используя аргумент -print0 для поиска и -null опция для xargs, чтобы справиться с этим.
find . -type f -name '*.py' -print0 | xargs --null grep "$1"
должно работать.