En Bash, puedo especificar nombres de archivos Foo1.png
usando Foo9.png
. Foo[0-9].png
Puedo evitar Foo5.png
usar Foo[1-46-9].png
. ¿Hay alguna forma de especificar una serie de exclusiones para el dígito decimal?
Por ejemplo, si quisiera excluir Foo3.png
y Foo7.png
, podría usar Foo[0-24-689]
, pero encontraría que un patrón como este Foo[^37].png
sería mucho más fácil de leer. Esa es la sintaxis de Vim y Bash no la interpreta excluyendo 3
y 7
. Pero me preguntaba si Bash tiene un patrón para la exclusión de caracteres en su expansión de nombre de archivo.
Si hay una solución que coincidatodocaracteres individuales distintos de 3
o 7
, que también serían útiles, en algunas circunstancias (como el particular que motivó esta pregunta, a pesar de la descripción demasiado simplificada anterior).
Respuesta1
El bash
shell comprende tanto el patrón similar a una expresión regular Foo[^37].png
como el patrón de shell estándar Foo[!37].png
, por lo que podrá usarlos sin problemas a menos que tenga otros archivos con nombres como Food.png
o Fool.png
etc. que deba excluir.
Si Foo[^37].png
no funciona como se esperaba en su script, entonces esto indica que no está usando bash
, sino algún otro shell como, por ejemplo dash
(¿posiblemente en un sistema que no sea GNU?). ¿Ejecutó el script sh
en la línea de comando? Si es así, no lo haga y utilice una #!
línea - adecuada en el script que apunte al intérprete de shell correcto.
Suponiendo que hay nombres como Food.png
ese que desea excluir, para asegurarse de que lo Foo
siga un dígito, luego .png
use Foo[0-9].png
. Para luego excluir Foo3.png
y Foo7.png
de estos, pruébelos por separado.
for name in Foo[0-9].png; do
case $name in (*[37].png) continue; esac
# process "$name" here
done
O, usando bash
la sintaxis,
for name in Foo[0-9].png; do
[[ $name == *[37].png ]] && continue
# process "$name" here
done
Como menciona Stéphane Chazelas en los comentarios a continuación, puede usar un patrón global extendido bash
para probar dígitos distintos de 3
y 7
. Habilite los patrones globbing extendidos con shopt -s extglob
y luego use el patrón
Foo!(!([0-9])|[37]).png
Pero sería más rápido para mí personalmente escribir el script como en la primera mitad de esta respuesta (o usarlo Foo[01245689].png
), ejecutarlo y listo, antes de decidir que creo que esta expresión está haciendo lo correcto ( hace).