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