Корректировка имен файлов временной метки с правильной датой создания

У меня есть куча файлов изображений, сохраненных в разных папках с ложной отметкой времени в имени файла (задержка 1 час), и я хочу исправить это в соответствии со creation time .

Сейчас я пытаюсь написать **shell script** который может пройти через все папки> извлечь время создания и заменить его на отметку времени имени файла, под небольшим примером:

Исходное имя файла с ложной отметкой времени:
Имя файла , Дата создания, Дата изменения
20180524010500530_FR785101.jpg, 2018-05-24 00:05:00, 2018-05-24 00:05:34

Выход будет:
Имя файла , Дата создания, Дата изменения
20180524000500530_FR785101.jpg, 2018-05-24 00:05:00, 2018-05-24 00:05:34

Кто-нибудь может сказать мне, если это возможно с помощью сценария оболочки? Тогда, кто-нибудь может дать мне какое-то руководство о том, как использовать команду ls или любую другую команду, которая может выполнить эту работу?

Я начал документировать себя с использованием команды ls но до сих пор не могу понять, как извлечь время создания и заменить его на временную метку имени файла, также я не знаю, как заставить скрипт пройти через все папки и подпапки, содержащие файлы изображений,

Вы можете использовать команду stat чтобы получить время создания файла.

 CREATION_TIME=`debugfs -R 'stat /path/to/file' /dev/sdaX | awk -F '-' '/crtime/{print $NF}'` 

И вы можете изменить дату изменения с помощью touch команды.

 touch -d "$CREATION_TIME" file 

Вот скрипт, который сделает это за вас, он строго использует предоставленный вами формат имени файла. Предполагая, что все файлы начинаются с даты и времени, и задержка всего 1 час, которую необходимо исправить. Он использует время эпохи, чтобы вычесть 1 час из времени в имени файла и переименовать файлы.

Измените каталог в скрипте на свой локальный.

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 

РЕДАКТИРОВАТЬ: Вот скрипт, сравнивающий дату рождения до переименования. (Обязательно сделайте резервную копию на всякий случай)

 #!/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