Expansão do nome do arquivo Bash: Evitando determinado caractere

Expansão do nome do arquivo Bash: Evitando determinado caractere

No Bash, posso especificar nomes de arquivos Foo1.pngusando . Posso evitar usar . Existe alguma maneira de especificar uma série de exclusões para o dígito decimal?Foo9.pngFoo[0-9].pngFoo5.pngFoo[1-46-9].png

Por exemplo, se eu quisesse excluir Foo3.pngand Foo7.png, poderia usar Foo[0-24-689], mas encontraria um padrão Foo[^37].pngmuito mais fácil de ler. Essa é a sintaxe do Vim, e o Bash não a interpreta excluindo 3e 7. Mas eu queria saber se o Bash tem um padrão para exclusão de caracteres em sua expansão de nome de arquivo.

Se houver uma solução que correspondatodoscaracteres únicos diferentes de 3ou 7, que também seriam úteis, em algumas circunstâncias (como aquele específico que motivou esta pergunta, apesar da descrição excessivamente simplificada acima).

Responder1

O bashshell entende tanto o padrão semelhante a uma expressão regular Foo[^37].pngquanto o padrão do shell padrão Foo[!37].png, portanto, você poderá usá-los sem problemas, a menos que tenha outros arquivos com nomes como Food.pngou Fool.pngetc.

Se Foo[^37].pngnão funcionar como esperado em seu script, isso indica que você não está usando bash, mas algum outro shell, como, por exemplo dash(possivelmente em um sistema não-GNU?) Você executou o script shna linha de comando? Nesse caso, não faça isso e use uma #!linha adequada no script apontando para o interpretador de shell correto.

Supondo que haja nomes como Food.pngesse que você deseja excluir, para ter certeza de que será Fooseguido por um dígito, então .pnguse Foo[0-9].png. Para então excluir Foo3.pnge Foo7.pngdestes, teste-os separadamente.

for name in Foo[0-9].png; do
    case $name in (*[37].png) continue; esac

    # process "$name" here
done

Ou, usando bashsintaxe,

for name in Foo[0-9].png; do
    [[ $name == *[37].png ]] && continue

    # process "$name" here
done

Como Stéphane Chazelas menciona nos comentários abaixo, você pode usar um padrão globbing estendido bashpara testar dígitos diferentes de 3e 7. Habilite padrões de globbing estendidos com shopt -s extglobe use o padrão

Foo!(!([0-9])|[37]).png

Mas seria mais rápido para mim pessoalmente escrever o script como na primeira metade desta resposta (ou usá Foo[01245689].png-lo), executá-lo e pronto, antes de decidir que acredito que esta expressão está fazendo a coisa certa (é faz).

informação relacionada