Filtragem de script de shell por meio de atributos de arquivos jpg

3

Estou tentando encontrar uma maneira de filtrar milhares de arquivos jpg e manter apenas os arquivos com um determinado atributo (como a marca da câmera na qual a foto foi capturada). Como posso fazer isso?

    
por Frédérick 12.05.2012 / 01:55

1 resposta

6

Existem várias ferramentas que podem extrair dados EXIF ou até mesmo manipular arquivos de imagem com base em seus dados EXIF.

Com exiftool , você pode renomear arquivos com base em propriedades exif. Em particular, você pode facilmente distribuir arquivos em subdiretórios nomeados após uma propriedade exif específica. Você pode revisar os resultados e excluir os diretórios que contêm arquivos que você não está interessado para o seu lazer.

exiftool  '-Directory<${Model}/%d' -r .

O Exiftool torna isso fácil, mas, para ilustração, aqui está um trecho de shell que classifica os arquivos jpeg em subdiretórios baseados em uma propriedade EXIF usando exif . O valor da propriedade não deve conter / caracteres. Você pode descobrir o número da opção -t executando exif -l .

for f in *.jpg; do
  v=$(exif -m -t 0x0110 -- "$f" 2>/dev/null)
  if [ -n "$v" ]; then
    mkdir -p -- "$v"
    mv -- "$f" "$v"
  fi
done

Com Exiv2 , substitua a linha v=… por v=$(exiv2 -g Exif.Image.Model -Pv -- "$f") .

Se os seus arquivos já estiverem organizados em uma árvore de diretórios, chame find para percorrer a árvore de diretórios recursivamente. Suponha que todas as suas imagens estejam em um diretório chamado unknown . O snippet abaixo cria um diretório para cada modelo de imagem e copia os arquivos, espelhando a hierarquia de diretórios original.

find unknown -name '*.jpg' -exec sh -c '
    v=$(exif -m -t 0x0110 -- "$f" 2>/dev/null)
    [ -n "$v" ] || exit
    d=${0#*/}; d=${d%/*}
    mkdir -p -- "$v/$d"
    mv "$0" "$v/$d"
' {} \;
    
por 12.05.2012 / 03:55