Crie subdiretórios e organize arquivos por data a partir do nome do arquivo

5

Eu tenho usado o seguinte script para organizar minhas fotos em Diretórios "Data":

for x in *.JPG; do
  d=$(date -r "$x" +%Y-%m-%d)
  mkdir -p "$d"
  mv -- "$x" "$d/"
done

Este script funciona muito bem. Meus arquivos de foto seguem a mesma convenção de nomenclatura 'IMG_20131125_090000.JPG', ou seja, data e hora da foto tirada. Existe uma maneira de alterar o script acima para que ele seja categorizado em diretórios de data ainda, mas usando a data no nome do arquivo em vez de usar a data em que o arquivo foi modificado?

    
por Wags 25.11.2013 / 18:33

2 respostas

3

Resposta corrigida para obter 2013-11-25 em vez de 20131125

Se o seu script for executado com um shell compatível com bash , a solução mais fácil é substituir

d=$(date -r "$x" +%Y-%m-%d)

com

d="${x:4:4}-${x:8:2}-${x:10:2}"

solução portátil com expr:

d=$(expr substr "$x" 5 4)-$(expr substr "$x" 9 2)-$(expr substr "$x" 11 2)

Se você precisa apenas 20131125 em vez de 2013-11-25 como nome do diretório, você também pode

Solução com sed:

d=$(echo "$x" | sed 's/.*_\([0-9]*\)_.*//')

Os comandos sed substituem o nome do arquivo pelo número entre os sublinhados (= a data).

Solução com o awk:

d=$(echo "$x" | awk -F _ '{print $2}')

Solução com corte :

d=$(echo "$x" | cut -d_ -f 2')
    
por 25.11.2013 / 18:40
3

Você pode usar:

export LC_ALL=C
for x in *.JPG; do
  d=$(date -d $( cut -d"_" -f2 <<< ${x} ) +%Y-%m-%d )
  mkdir -p "$d"
  mv -- "$x" "$d/"
done
    
por 25.11.2013 / 18:44