Como apagar ou mover cada imagem no diretório de dimensões específicas para o novo diretório no bash

2

Estou tentando encontrar uma maneira de fazer o seguinte (o Google só está retornando resultados para encontrar):

  1. Mova todas as imagens do tipo de arquivo (.jpg, .png ou .gif, etc.) da (s) dimensão (s) especificada (s) (como 1920x1080, menor que 1600, etc.) do diretório atual para outro diretório

  2. Exclua todas as imagens da (s) dimensão (ns) especificada (s) no diretório atual.

por Jin 16.08.2015 / 08:14

1 resposta

2

Isso moverá todos os arquivos jpg, png ou gif da dimensão 1920x1080 do diretório atual para targetdir :

#!/bin/bash
shopt -s nullglob
for fname in *.jpg *.png *.gif
do
    read width height < <(exiv2 "$fname" 2>&1 | awk '/^Image size/{print $4,$6}')
    [ "$width" ] || continue
    [ "$width" -eq 1920 ] && [ "$height" -eq 1080 ] && mv "$fname" targetdir/
done

Isso examina o diretório atual e exclui todas as imagens de jpg, png ou gif com largura menor que 1600:

#!/bin/bash
shopt -s nullglob
for fname in *.jpg *.png *.gif
do
    read width height < <(exiv2 "$fname" 2>&1 | awk '/^Image size/{print $4,$6}')
    [ "$width" ] || continue
    [ "$width" -lt 1600 ] && rm "$fname"
done

Isso usa o tamanho da imagem de captura do utilitário exiv2 . Em um sistema parecido com o Debian, exiv2 pode ser instalado executando apt-get install exiv2 . Com pequenas modificações, utilitários semelhantes, como identify do ImageMagick, podem ser usados.

Este script requer bash .

Como funciona

  • shopt -s nullglob

    Ignore tipos de arquivos ausentes.

  • for fname in *.jpg *.png *.gif; do

    Isso inicia um loop sobre todos os arquivos no diretório cujos nomes terminam com .jpg , .png e .gif .

  • read width height < <(exiv2 "$fname" 2>&1 | awk '/^Image size/{print $4,$6}')

    Isso usa o utilitário exiv2 para extrair o tamanho da imagem. Como exiv2 produz várias linhas de saída, awk é usado para selecionar as informações de que precisamos.

  • [ "$width" ] || continue

    Se não recuperamos um tamanho de imagem do comando acima, pule este arquivo. Isso acontecerá se, por exemplo, o arquivo não for realmente um arquivo de imagem.

  • [ "$width" -lt 1600 ] && rm "$fname"

    Se a largura da imagem atender a nossa condição, execute rm para excluir o arquivo.

  • done

    Isso sinaliza o final do loop.

por 16.08.2015 / 08:39

Tags