Pagina inicial » como » Encontrar imagens PNG maiores que x pixels através do shell do Linux

    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.