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

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

Alguém pode me ajudar com um padrão de correspondência de arquivos 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

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

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

Alguém pode sugerir como fazer isso?

Responder1

Supondo que todos os arquivos -nsejam 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 extglobopção definida ( shopt -s extglob):

for f in !(*_thumb.png|*-[1-9].png); do
  g=${f%.png}-1.png
  test -f $g || echo $f
done

Responder2

Se for apenas "-1" que determina que é uma cópia, então você também não tem cópia dos arquivos 2-1.png ou 2-1_thumb.png. Se esse for o seu critério de correspondência e você quiser testar os polegares 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 contarem, a resposta do KAK deve servir

informação relacionada