Bash shell: ¿enumera todos los archivos de tipo .png o .PNG?

14

En un script bash, ¿cómo puedo decir 'para todos los archivos de tipo .png o .PNG'?

Lo estoy intentando :

for i in (`ls *.PNG` && `ls *.png`)

pero obteniendo un error de sintaxis.

Simón
fuente

Respuestas:

18

Si desea todas las combinaciones posibles, use:

for i in *.[Pp][Nn][Gg]; do

o

shopt -s nocaseglob
for i in *.png; do

aunque ese hará que todos los globos de shell de su script (es decir, coincide con el archivo comodín) no distingan entre mayúsculas y minúsculas hasta que se ejecute shopt -u nocaseglob.

Si realmente quiere solo .PNG y .png (y no, por ejemplo, .PnG o .pnG), use cualquiera

shopt -s nullglob
for i in *.png *.PNG; do

o

for i in *.png *.PNG; do
    [[ -e "$i" ]] || continue

... el motivo de la comprobación de existencia nula o de globo es que si solo tiene extensiones en minúsculas o mayúsculas, incluirá el patrón no coincidente en la lista de archivos, lo que provocará un error en el cuerpo del bucle. Al igual que con nocaseglob, es posible que desee desactivar la opción de shell nullglob después (aunque en mi experiencia tener nullglob activado a menudo es bueno, especialmente en un script). En realidad, más bien considero que es una buena idea usar nocaseglob o la verificación de existencia para todas las coincidencias de archivos como esta, en caso de que no haya coincidencias.

Gordon Davisson
fuente
55
for i in *.{png,PNG}
Glenn Jackman
@glenn: Eso también funcionaría (equivalente a `* .png * .PNG), aunque todavía necesita nullglob o la verificación de existencia.
Gordon Davisson
5

También puedes probar una línea como

encontrar . -iname "* .png" -exec ....

o

encontrar . -iname "* .png" | xargs ....

Editar
Véase también el comentario de @ Yab a continuación sobre la recursividad.

Alain Pannetier
fuente
1
sin embargo, find es, por defecto, recursivo, por lo que para obtener el mismo resultado que hace la pregunta, debería hacerlo find -maxdepth 1 -iname "*.png"
Yab
@Yab, tienes toda la razón. Pasé por alto este aspecto.
Alain Pannetier
1

ls es casi inútil aquí, pero para el registro aquí hay una sintaxis más cercana a su intento:

for i in $(ls *.PNG ; ls *.png)

Notas:

  • Supongo que quieres imágenes en mayúsculas y minúsculas. El separador && significaría procesar archivos png solo si existen archivos PNG, lo que probablemente no tiene mucho sentido.
  • Aparecerán mensajes de error si no se encuentran archivos con ninguno de los patrones.
jlliagre
fuente