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 -1
algum 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 -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 extglob
opçã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