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