Expansión del nombre de archivo Bash: evitar ciertos caracteres

Expansión del nombre de archivo Bash: evitar ciertos caracteres

En Bash, puedo especificar nombres de archivos Foo1.pngusando Foo9.png. Foo[0-9].pngPuedo evitar Foo5.pngusar 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.pngy Foo7.png, podría usar Foo[0-24-689], pero encontraría que un patrón como este Foo[^37].pngsería mucho más fácil de leer. Esa es la sintaxis de Vim y Bash no la interpreta excluyendo 3y 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 3o 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 bashshell comprende tanto el patrón similar a una expresión regular Foo[^37].pngcomo 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.pngo Fool.pngetc. que deba excluir.

Si Foo[^37].pngno 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 shen 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.pngese que desea excluir, para asegurarse de que lo Foosiga un dígito, luego .pnguse Foo[0-9].png. Para luego excluir Foo3.pngy Foo7.pngde 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 bashla 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 bashpara probar dígitos distintos de 3y 7. Habilite los patrones globbing extendidos con shopt -s extgloby 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).

información relacionada