Renomear o arquivo em lote: Melhor maneira do que o ID aleatório para evitar a exclusão de arquivos com nomes de arquivos duplicados?

5

Eu quero renomear um monte de fotos de feriados anteriores, feitas por pessoas diferentes usando dispositivos diferentes (celular, câmera, etc.) e de diferentes ângulos. Acabei de escrever um pequeno script para me ajudar:

#!/bin/bash
for f in *; do
  # generate random id to prevent deletion of files with duplicate names 
  randomid=$(tr -dc "[:alnum:]" < /dev/urandom | head -c 10)
  # add modification date and time including seconds to the filename, attach location and random id 
  mv -- "$f" "$(date +%Y-%m-%d-%R:%S -r "${f}")_location_${randomid}.jpg";
done

Os resultados são arquivos com nomes parecidos: 2016-08-09-15: 56: 24_location_uPe38A20tn.jpg

Eu tive que adicionar o id aleatório, como há fotos, tiradas no mesmo DATETIME e segundo, então os arquivos acabaram tendo nomes de arquivos duplicados e foram deletados no processo.

Você vê outra maneira de garantir que as fotos, que foram tiradas na mesma data no mesmo segundo, não serão excluídas - além da minha ideia com o ID aleatório?

Obrigado pela sua ajuda!

    
por Katja Eichelberger 27.08.2016 / 22:49

3 respostas

2

Isso gerará números duplicados 1, 2, 3 e assim por diante.

dest=$(date +%Y-%m-%d-%R:%S -r "${f}")_location_
id=
while [ -f "$dest""$id".jpg ] ; do
    ((id++))
done
dest="$dest""$id".jpg
mv -- "$f" "$dest"

Ele deve ser colocado dentro do loop for f in * .

    
por 28.08.2016 / 00:25
2

Não vejo nenhum bom motivo para os distinguisos aleatórios aqui. Se você não tem um nome natural para distinguir os arquivos, use um contador, parece mais amigável. A solução simples é usar um contador global e sistemático.

counter=1
for f in *; do
  base="$(date +%Y-%m-%d-%R:%S -r "${f}")_location_"
  mv -- "$f" "$base_$counter.jpg"
  counter=$((counter+1))
done

Se você quiser usar um contador somente quando houver conflitos, teste os nomes dos arquivos antes de renomear.

for f in *; do
  base="$(date +%Y-%m-%d-%R:%S -r "${f}")_location_"
  set -- "$base"*.jpg
  if [ -e "$1" ]; then
    if [ "$1" = "$base.jpg" ]; then
      mv "$base.jpg" "$base_1.jpg"
    fi
    mv "$base.jpg" "$base_$(($#+1)).jpg"
  else
    mv -- "$f" "$base.jpg"
  fi
done

(aviso, código não testado)

    
por 28.08.2016 / 01:15
1

Aqui estão algumas pequenas melhorias no seu script. Ele solicita possíveis duplicatas e considera a extensão do nome do arquivo:

#!/bin/bash

# for each file
for f in *.{jpg,jpeg}; do
  # generate random id to prevent deletion of duplicates
  randomid=$(tr -dc "[:alnum:]" < /dev/urandom | head -c 10)
  # add modification date and time (divided by dashes) to the current filename
  # -i prompts on possible duplicates. 
  mv -i -- "$f" "$(date +%Y-%m-%d-%R:%S -r "${f}")_location_${randomid}.jpg";
done
    
por 04.11.2016 / 11:10