Utilizando “for in” para iterar os arquivos, mas exceto o (s) especificado (s) no shell

0

Encontrei um post aqui Como posso executar o mogrify? mas prefixo o nome do arquivo? que está falando sobre o redimensionamento de um lote de imagens.

Nele há um script de shell for in . Como faço para excluir alguns arquivos únicos enquanto iterar a maioria dos demais.

for image in *.png; do convert "$image" -resize 29.5% "$(dirname $image)/th_$(basename $image)"; done

Por exemplo:

Eu tenho esses arquivos na minha pasta (não tem nomes comuns como o mesmo prefixo):

example_1_some_suffix.png
some_prefix_example_2.png
example_3.png
example_4.png
example_a.png

Eu posso usar for images in *.png para iterar tudo, mas e se eu quiser apenas fazer as coisas com os quatro primeiros arquivos e deixar o quinto fora?

    
por AGamePlayer 08.01.2015 / 14:53

2 respostas

1

Você pode ativar o extglob para poder especificar a máscara em mais detalhes

shopt -s extglob
for image in ?(a)+(b)*.png ; do ...

Se você quer apenas pular um determinado arquivo, você pode fazer

for image in *.png ; do
    [[ $image == file-to-skip.png ]] && continue
    ...
    
por 08.01.2015 / 14:59
1

Supondo que você tenha a versão 4 do bash:

declare -A exceptions=(
    [example_1_some_suffix.png]=skip
    [some_prefix_example_2.png]=skip
    [example_3.png]=skip
    [example_4.png]=skip
    [example_a.png]=skip
)
for image in *.png; do 
    [[ "${exceptions["$image"]}" == skip ]] && continue 
    # ...

Sem usar matrizes associativas:

exceptions=(
    example_1_some_suffix.png 
    some_prefix_example_2.png 
    example_3.png 
    example_4.png 
    example_a.png 
)
for image in *.png; do 
    [[ " ${exceptions[*]} " == *" $image "* ]] && continue 
    # ...

Todas as citações e espaços necessários.

    
por 08.01.2015 / 15:33

Tags