Encontrar imagens PNG maiores que x pixels através do shell do Linux
Quando você está tentando trabalhar em mudar o design do seu site, você deve se preocupar com a largura das imagens no conteúdo do seu artigo. Eu tenho capturas de tela notoriamente grandes na maioria dos artigos que eu escrevi, então se eu quiser aumentar a barra lateral é fundamental descobrir quais fotos serão muito grandes para caber no novo design.
Como sou programador, seria fácil escrever um pequeno aplicativo para fazer isso, mas isso me fez começar a pensar ... por que não posso fazer isso na linha de comando do Linux??
A primeira coisa que descobri foi que as imagens PNG exibem os dados de tamanho quando você executa o comando “file” neles:
$ file image3.png
image3.png: dados de imagem PNG, 613 x 657, RGBA de 8 bits / cor, não entrelaçado
Muito útil, já que 99% da imagem neste site estão no formato PNG. Então, agora para lançá-lo em um loop para todos os arquivos no meu diretório de upload:
$ para f em * .png; do arquivo $ f;
image.png: Dados da imagem PNG, 631 x 185, RGBA 8 bits / cor, não entrelaçados
image1.png: dados de imagem PNG, 631 x 96, RGBA 8 bits / cor, não entrelaçados
image10.png: dados de imagem PNG, 375 x 395, 8 bits / cor RGBA, não entrelaçado
image11.png: dados de imagem PNG, 484 x 241, 8 bits / cor RGBA, não entrelaçado
-recortado-
Isso é mais útil, mas eu teria que puxar os dados para o Excel ou um aplicativo semelhante para ordenar os dados, então decidi usar o comando linux "cut" para extrair apenas a coluna de largura.
Você notará que o parâmetro -f5 diz ao cut para assumir a quinta coluna, e o -d \ com um espaço após ele diz ao cut para usar um espaço como o delimitador. A barra \ caractere é um caractere de escape para dizer ao shell para usar o espaço como um caractere, e não como um espaço em branco.
$ para f em * .png; do arquivo $ f | cut -f5 -d \; done
631
631
375
484
-recortado-
Não é totalmente útil, é? Vamos empurrar isso através de uma instrução bash if e, em seguida, mostrar apenas a saída do comando file quando a largura for maior que 600 pixels.
Observe as marcas '(backtick) ao redor do arquivo' $ f | corte ... ”, que indicam que os comandos dentro do 'serão processados como uma única saída e alimentados na instrução if, onde usamos um -gt (maior que). Observe também que você precisa de espaços ao redor dos dois lados dos colchetes []
para f em * .png; do if ['file $ f | corte -f5-d \ '-gt 600]; então arquive $ f; fi; feito
image.png: Dados da imagem PNG, 631 x 185, RGBA 8 bits / cor, não entrelaçados
image1.png: dados de imagem PNG, 631 x 96, RGBA 8 bits / cor, não entrelaçados
image17.png: dados de imagem PNG, 638 x 340, RGBA de 8 bits / cor, não entrelaçado
image18.png: dados de imagem PNG, 608 x 448, 8 bits / cor RGBA, não entrelaçado
-recortado-
Agora temos uma lista de todos os arquivos com mais de 600 pixels de largura. Você poderia ajustar o “arquivo $ f” no final para apenas ecoar os nomes dos arquivos se você precisasse copiá-los ou movê-los para outro lugar:
para f em * .png; do if ['file $ f | corte -f5-d \ '-gt 600]; então ecoar $ f; fi; feito
image.png
image1.png
image17.png
image18.png
-recortado-
O shell do Linux é incrivelmente poderoso! Esta solução não é realmente prática para todos, mas é bom saber como trabalhar com o shell para que você possa realizar esse tipo de tarefa quando precisar.