Em bash
você pode definir nocaseglob
:
shopt -s nocaseglob
for file in "$arg"/**/*.{txt,h,py}
do
....
done
shopt -u nocaseglob
noclaseglob
é bom para usar em qualquer bash
desde 2.01, no entanto **
requer bash
4.0 ou posterior (e segue links simbólicos até bash
4.3 onde foi corrigido). Observe a correção para citar $arg
, pois haverá problemas se contiverem espaços ou caracteres glob.
Sem usar **
, você pode fazer algo como:
find "$arg" \( -iname '*.txt' -o -iname '*.h' -o -iname '*.py' \) -exec bash -c '
for file; do
...
done' bash {} +
Isto irá encontrar todos os arquivos que você está procurando e passá-los como argumentos separados para uma nova instância do bash, que então passará por eles. Se a sua operação por arquivo for um único comando, você provavelmente poderá ignorar a nova instância do bash e usar o comando diretamente.
Atualizar
De acordo com os comentários de Stephane abaixo, a solução compatível com POSIX é:
find "$arg" \( -name '*.[tT][xX][tT]' -o -name '*.[hH]' -o -name '*.[pP][yY]' \) \
-exec sh -c '
for file do
...
done' sh {} +