Aqui está um script que fará isso para você. Ele usa estritamente o formato de nome de arquivo que você forneceu. Assumindo que todos os arquivos começam com o primeiro dia e que apenas 1 hora de atraso precisa ser corrigido. Está usando o tempo de época para subtrair 1 hora do tempo no nome do arquivo e renomear os arquivos.
Altere o diretório no script para o seu local.
looper.sh
#!/bin/bash
echo "Sending directory to the past."
for path in /path/to/directory/*.jpg; do
filename=${path##*/}
#Convert to date format
oldDate="${filename:0:4}-${filename:4:2}-${filename:6:2} ${filename:8:2}:${filename:10:2}:${filename:12:2}"
#Get the epoch date
epochDate=$(date -d "$oldDate" +%s)
#Subtract 1 hour
epochDate=$(( $epochDate - 60*60 ))
#Converting and formating the new date
newDate=$(date -d @$epochDate +%Y%m%d%H%M%S)
#New filename
newFilename=$(dirname $path)/$newDate"${filename:14}"
#Renaming the file
mv $path $newFilename
done
EDITAR:
Aqui está um script que compara a data de nascimento antes de renomear. (Certifique-se de fazer backup apenas no caso)
#!/bin/bash
echo "Sending directory to the past."
for path in /path/to/directory/*.jpg; do
filename=${path##*/}
#Convert to date format
oldDate="${filename:0:4}-${filename:4:2}-${filename:6:2} ${filename:8:2}:${filename:10:2}:${filename:12:2}"
#Get the epoch date
epochDate=$(date -d "$oldDate" +%s)
#Birth date - Only works if your filesystem supports it.
birthDate=$(stat $path | grep 'Birth:' | sed 's/\..*//' | awk '{print $2" "$3}')
epochBirthDate=$(date -d "$birthDate" +%s)
if [ $epochDate != $epochBirthDate ]; then
#Subtract 1 hour
epochDate=$(( $epochDate - 60*60 ))
#Converting and formating the new date
newDate=$(date -d @$epochDate +%Y%m%d%H%M%S)
#New filename
newFilename=$(dirname $path)/$newDate"${filename:14}"
#Renaming the file
mv $path $newFilename
fi
done