Classificando Fotos Usando o Script de Shell

3

A maioria dos meus arquivos de fotos tem a seguinte convenção de nomes / formato IMG_20131204_120000.JPG, mostrando a data e hora em que a foto foi tirada (convenção de nomenclatura iPhone / Apple). No entanto, nem todas as minhas fotos seguem essa convenção de nomenclatura. Com a ajuda deste fórum, desenvolvi o seguinte script para categorizar minhas fotos em diretórios de data:

cd '/photos/' 
for x in *.JPG *.jpg *.TIF *.tif *.PNG *.png *.BMP *.bmp *.GIF *.gif *.IMG *.img *.JPEG *.jpeg *.TIFF *.tiff; do
  d=$(date -r "$x" +%Y%m%d)" - Family Photos"
  t=$(expr substr "$x" 1 4)
  if [ "$t" == "IMG_" ]; then
    d=$(expr substr "$x" 5 8)" - Family Photos"
  fi
  mkdir -p "$d" >/dev/null 2>&1
  mv -- "$x" "$d/" >/dev/null 2>&1
done

PS. Eu uso a instrução IF para pegar a data do nome do arquivo se o nome do arquivo estiver no formato IMG_20131204_120000.JPG, pois essa data reflete com mais precisão a data em que a foto foi realmente tirada, mas se o arquivo não seguir essa convenção de nomenclatura tomar a data do sistema operacional de quando o arquivo foi modificado / criado pela última vez.

Funciona bem na maior parte, exceto onde há arquivos que começam com "IMG_", mas não estão em conformidade com a convenção de nomenclatura IMG_20131204_120000.JPG, por exemplo, um arquivo chamado IMG_001.JPG ou IMG_Photo1. Existe uma maneira melhor de estruturar a instrução IF aqui, para que ela verifique não apenas se o arquivo inicia com "IMG_", mas também os próximos 8 caracteres são números / um formato de data?

    
por Wags 04.12.2013 / 22:35

2 respostas

2

Você pode alterar seu comando if para algo assim:

if [[ "$t" =~ IMG_+[0-9]{8}[a-zA-Z]*$ ]]

O =~ é um operador de comparação de expressões regulares que é introduzido na versão bash 3 e acima.

Usando esta declaração if, você pode capturar nomes como IMG_11111111alphabets.ext . Você pode brincar com ele e personalizá-lo de acordo com suas necessidades. Para mais informações, veja: a expressão regular do Bash

    
por 04.12.2013 / 23:07
5

Eu poderia fazer isso de maneira um pouco diferente. O ImageMagik pode ler os metadados exif de seus arquivos de imagem. O formato não muda.

identify -verbose example.jpg

retorna (junto com muitas outras informações)

Propriedades:

data: criar: 2013-11-07T04: 55: 55-06: 00
data: modificar: 2013-11-07T04: 55: 55-06: 00

Você poderia grep a data de criação e então analisá-la para que você realmente não precisasse lidar com as declarações condicionais ou analisar um nome de arquivo estranho em tudo

    
por 04.12.2013 / 23:23