Pensé que esto sería simple, pero está resultando más complejo de lo que esperaba.
Quiero iterar a través de todos los archivos de un tipo particular en un directorio, así que escribo esto:
#!/bin/bash
for fname in *.zip ; do
echo current file is ${fname}
done
Esto funciona siempre que haya al menos un archivo coincidente en el directorio. Sin embargo, si no hay archivos coincidentes, obtengo esto:
current file is *.zip
Entonces intenté:
#!/bin/bash
FILES=`ls *.zip`
for fname in "${FILES}" ; do
echo current file is ${fname}
done
Si bien el cuerpo del bucle no se ejecuta cuando no hay archivos, recibo un error de ls:
ls: *.zip: No such file or directory
¿Cómo escribo un bucle que no maneja limpiamente los archivos coincidentes?
FILES=
ls * .zip ; for fname in "${FILES}"...
pero funciona como se esperaba confor fname in *.zip ; do....
for file in *.zip
, no `ls ...`
. La sugerencia de @ cuonglm es que se *.zip
expanda a nada cuando el patrón no coincide con ningún archivo. ls
sin argumentos enumera el directorio actual.
ls
generalmente se debe evitar analizar la salida de : ¿Por qué no analizar ls
? ; También vea el enlace cerca de la parte superior de esa página al artículo ParsingLs de BashGuide .
shopt -s nullglob
antes de ejecutar el bucle for.