使用正确的创建日期对时间戳进行文件名更正

使用正确的创建日期对时间戳进行文件名更正

我有一堆图像文件保存在不同的文件夹中,文件名上有错误的时间戳(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

谁能告诉我 shell 脚本是否可以实现这一点?那么,任何人都可以指导我如何使用该ls命令或任何其他可以完成这项工作的命令吗?

我已经开始记录自己使用该ls命令的情况,但我仍然无法弄清楚如何提取创建时间并将其替换为文件名时间戳,我也不知道如何使脚本运行所有文件夹以及包含图像文件的子文件夹,

答案1

您可以使用stat命令来获取文件创建时间。

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

您可以使用touch命令更改修改日期。

touch -d "$CREATION_TIME" file

答案2

这是一个可以为您执行此操作的脚本,它严格使用您提供的文件名格式。假设所有文件首先以日期时间开始,并且只需要修复 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

相关内容