Padrão de correspondência de arquivo na linha de comando?

0

Alguém pode me ajudar com um padrão de correspondência de arquivo de linha de comando relativamente complexo?

Eu tenho arquivos em um diretório da seguinte forma:

1.png
1_thumb.png
1-1.png
1-1_thumb.png
1-2.png
1-2_thumb.png
2.png 
2_thumb.png
2-1.png
2-1_thumb.png
3.png
3_thumb.png
3-1_thumb.png

Eu quero listar todos os arquivos que não possuem uma cópia com o mesmo nome de arquivo com -1 em algum lugar. Portanto, no exemplo acima, os resultados seriam 3.png .

NB: o arquivo e sua cópia com "-1" serão do mesmo tamanho de arquivo, se isso ajudar.

Alguém pode sugerir como fazer isso?

    
por Richard 09.09.2011 / 15:54

2 respostas

2

Supondo que todos os arquivos com -n sejam uma cópia e que você também não queira os polegares, isso funciona no KornShell (ksh) e também no Bash com a opção extglob definida ( shopt -s extglob ):

for f in !(*_thumb.png|*-[1-9].png); do
  g=${f%.png}-1.png
  test -f $g || echo $f
done
    
por 09.09.2011 / 16:05
0

Se for apenas "-1" que determina que é uma cópia, então você não tem cópia do seu 2-1.png ou 2-1_thumb.png arquivos também. Se esse é o seu critério de correspondência e você quer os polegares testados também, você pode fazer

for i in 'ls |grep -v "\-1"  | cut -f1 -d.'; do 
    if 'echo $i | grep thumb > /dev/null'; then 
        test -f 'echo $i.png | sed 's/_/-1_/g'' || echo $i.png; 
    else 
        test -f $i-1.png || echo $i.png; 
    fi; 
done

Caso contrário, se os polegares não contam, a resposta do KAK deve ser adequada

    
por 09.09.2011 / 19:35