
Desafio: Preciso analisar a saída do comando "identificar" do imagemagick para detectar a presença de uma string específica. Se não existir, eu ecoo o nome do arquivo na tela.
Fundo: Tenho cerca de 100 mil imagens em miniatura (Exemplo de miniatura que precisa ser analisada). Preciso inspecionar cada miniatura para garantir que foi renderizada corretamente. Felizmente, “renderizado corretamente” pode ser determinado pela presença de pixels vermelhos na miniatura. Usando o comando "identificar" do imagemagick, posso gerar o mapa de cores que conterá a linha "(255, 0, 0) #FF0000 vermelho".
Precisar: Usando um script bash, posso obter facilmente todos os nomes de arquivos e iterá-los. Eu preciso descobrir comosilenciosamenteanalise a saída e procure uma correspondência de string e ecoe o nome do arquivo se não for encontrado.
Especificamente, o que pretendo fazer é criar um script que faça o seguinte:
1) encontra todos os arquivos *.png em um diretório específico.
2) para cada arquivo, execute "identificar -verbose" esilenciosamentepasse a saída para...
3) analise a saída para ver se a string "(255, 0, 0) #FF0000 red" existe.
3a) se isso acontecer, continuo silenciosamente para o próximo arquivo.
3b) caso contrário, eu echo o nome do arquivo.
No final das contas, ficaria com uma pequena lista de miniaturas que não continham nenhum pixel vermelho e exigiam inspeção manual.
Qualquer ajuda para criar este script seriamaioriaestimado.
Responder1
Para encontrar arquivos que não possuem pixels vermelhos:
for i in *png; do identify -verbose "$i" | gawk -e "{print \"$i\", \$0}" | fgrep -q '(255, 0, 0) #FF0000 red' || echo $i; done
Para encontrar arquivos com pixels vermelhos:
for i in *png; do identify -verbose "$i" | gawk -e "{print \"$i\", \$0}" | fgrep -q '(255, 0, 0) #FF0000 red' && echo $i; done
O comando gawk adiciona o nome do arquivo a cada linha de saída do comando identificar. Usar fgrep em vez de grep apenas procura correspondências exatas de texto (mais rápido). O sinalizador -q para fgrep informa para não gerar nenhuma linha; apenas para definir o status de sucesso ou fracasso.
O script deve ser seguro para nomes de arquivos que contenham espaços.