Esto es probablemente bastante fácil, pero no puedo resolverlo. En un ciclo for, quiero excluir ciertos archivos con el prefijo zz
(por ejemplo zz131232.JPG
), pero no sé cómo excluir estos archivos.
for i in *.JPG; do # do something done
¿Cómo modifico la 'regla for' para excluir archivos con el prefijo zz
?
Algo como
for i in *.JPG; do [[ $i != "zz"* ]] && echo "$i" done
o saltarlos:
for i in *.JPG; do [[ $i == "zz"* ]] && continue # process the other files here done
Si está tratando con muchos archivos, también puede usar GLOBIGNORE
o extended globbing
para evitar expandir los archivos que desea omitir en primer lugar (que podría ser más rápido):
GLOBIGNORE='zz*' for file in *.JPG; do do_something_with "${file}" done # save and restore GLOBIGNORE if necessary
o
shopt -s extglob # enable extended globbing for file in !(zz*).JPG; do do_something_with "${file}" done shopt -u extglob # disable extended globbing, if necessary
Tenga en cuenta que si no hay archivos .JPG
en el directorio actual, el bucle aún se ingresará y $i
se establecerá en el literal *.JPG
(en su ejemplo), por lo que debe verificar si el archivo existe dentro del bucle o utilice la opción nullglob
.
for file in *.JPG; do [ -e "${file}" ] || continue do_something_with "${file}" done
o
shopt -s nullglob for file *.JPG; do do_something_with "${file}" done shopt -u nullglob # if necessary
Pruebe lo siguiente en su shell para comprender qué sucede sin nullglob
:
$ for f in *.doesnotexist; do echo "$f"; done *.doesnotexist