No Bash, posso especificar nomes de arquivos Foo1.png
usando . Posso evitar usar . Existe alguma maneira de especificar uma série de exclusões para o dígito decimal?Foo9.png
Foo[0-9].png
Foo5.png
Foo[1-46-9].png
Por exemplo, se eu quisesse excluir Foo3.png
and Foo7.png
, poderia usar Foo[0-24-689]
, mas encontraria um padrão Foo[^37].png
muito mais fácil de ler. Essa é a sintaxe do Vim, e o Bash não a interpreta excluindo 3
e 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 3
ou 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 bash
shell entende tanto o padrão semelhante a uma expressão regular Foo[^37].png
quanto 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.png
ou Fool.png
etc.
Se Foo[^37].png
nã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 sh
na 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.png
esse que você deseja excluir, para ter certeza de que será Foo
seguido por um dígito, então .png
use Foo[0-9].png
. Para então excluir Foo3.png
e Foo7.png
destes, teste-os separadamente.
for name in Foo[0-9].png; do
case $name in (*[37].png) continue; esac
# process "$name" here
done
Ou, usando bash
sintaxe,
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 bash
para testar dígitos diferentes de 3
e 7
. Habilite padrões de globbing estendidos com shopt -s extglob
e 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).