Coincidencia de archivos con varias extensiones usando for loop

Estoy intentando hacer coincidir y recorrer archivos con extensiones .txt .h .py. en la carpeta específica $ {arg}. Aquí esta lo que hice

for file in ${arg}/*.{txt, h, py}; do ... done 

Sin embargo, no obtuve ese archivo para todas las extensiones a pesar de que tengo dichos archivos.

  line 24: dir1/*.{txt,: No such file or directory line 24: h,: No such file or directory line 24: py}: No such file or directory 

¿Cómo puedo utilizar los archivos con extensiones especificadas utilizando for ?

Pierde los espacios; Bash cuida.

 for file in "${arg}"/*.{txt,h,py}; do 

Como Ignacio ya te dijo, debes eliminar los espacios. Y si quiere hacer esto recursivamente para los subdirectorios también use el doble ** globbing:

 for file in ${arg}/**/*.{txt,h,py} do .... done 

ps: funciona solo en bash4

Me gustaría sugerir 2 mejoras a la solución propuesta:

R. El archivo for en “$ arg” / . {Txt, h, py} también producirá “$ arg” / .txt si no hay archivos con extensión de texto y eso crea errores con los scripts:

 $ echo *.{txt,h,py} *.txt *.h doSomething.py 

Para evitar eso, justo antes del bucle for, configure el nullglob para eliminar los globos nulos de la lista:

 $ shopt -s nullglob # Sets nullglob $ echo *.{txt,h,py} doSomething.py $ shopt -u nullglob # Unsets nullglob 

B. Si también desea buscar * .txt o * .TXT o incluso * .TxT (es decir, ignorar el caso), también debe configurar el nocaseglob:

 $ shopt -s nullglob # Sets nullglob $ shopt -s nocaseglob # Sets nocaseglob $ echo *.{txt,h,py} myFile.TxT doSomething.py $ shopt -u nocaseglob # Unsets nocaseglob $ shopt -u nullglob # Unsets nullglob