script programas por extension ejemplos consola comandos comando buscar basicos archivos bash file glob

bash - programas - Pasa por todos los archivos con una extensión específica



ejemplos de programas en bash (6)

Agregar recursivamente subcarpetas,

for i in `find . -name "*.java" -type f`; do echo "$i" done

for i in $(ls);do if [ $i = ''*.java'' ];then echo "I do something with the file $i" fi done

Quiero recorrer cada archivo en la carpeta actual y verificar si coincide con una extensión específica. El código anterior no funciona, ¿sabes por qué?


Estoy de acuerdo con las otras respuestas sobre la forma correcta de recorrer los archivos. Sin embargo, el OP preguntó:

El código anterior no funciona, ¿sabes por qué?

¡Sí!

Un artículo excelente ¿Cuál es la diferencia entre la prueba, [y [[??] Explica en detalle que, entre otras diferencias, no puede usar la expression matching o pattern matching dentro del comando de test (que es una abreviación para [ )

Feature new test [[ old test [ Example Pattern matching = (or ==) (not available) [[ $name = a* ]] || echo "name does not start with an ''a'': $name" Regular Expression =~ (not available) [[ $(date) =~ ^Fri/ .../ 13 ]] && echo "It''s Friday the 13th!" matching

Esta es la razón por la que falla tu secuencia de comandos. Si el OP está interesado en una respuesta con la sintaxis [[ (que tiene la desventaja de no ser compatible con tantas plataformas como el [ comando)], me gustaría editar mi respuesta para incluirla.

EDITAR: Cualquier protuberancia de cómo formatear los datos en la respuesta como una tabla sería útil.


No se necesitan trucos de fantasía:

for i in *.java; do [ -f "$i" ] || break ... done

El guardia se asegura de que si no hay archivos coincidentes, el ciclo se cerrará sin tratar de procesar un nombre de archivo inexistente *.java . En bash (o shells que soportan algo similar), puede usar la opción nullglob para simplemente ignorar una coincidencia fallida y no ingresar el cuerpo del bucle.

shopt -s nullglob for i in *.java; do ... done


Pasa por todos los archivos y termina con: ( .img , .bin , .txt ) e imprime el nombre del archivo

for i in *.img *.bin *.txt; do echo "File is: $i" done

O si te gusta recursivamente (encuentra también en todos los subdirectorios):

for i in `find . -type f -name "*.img" -o -name "*.bin" -o -name "*.txt"`; do echo "File is: $i" done


como @chepner dice en su comentario que está comparando $ i con una cadena fija.

Para expandir y rectificar la situación, debe usar [[]] con el operador de expresiones regulares = ~

p.ej:

for i in $(ls);do if [[ $i =~ .*/.java$ ]];then echo "I want to do something with the file $i" fi done

la expresión regular a la derecha de = ~ se prueba con el valor del operador de la mano izquierda y no se debe citar, (la cita no arrojará un error, pero se comparará con una cadena fija y, por lo tanto, es muy probable que falle "

pero la respuesta de @chepner anterior usando glob es un mecanismo mucho más eficiente.


la respuesta correcta es @ chepner''s

EXT=java for i in *.${EXT}; do ... done

sin embargo, aquí hay un pequeño truco para verificar si un nombre de archivo tiene una extensión determinada:

EXT=java for i in *; do if [ "${i}" != "${i%.${EXT}}" ];then echo "I do something with the file $i" fi done