如何更改多个文件的修改日期(元数据)?

如何更改多个文件的修改日期(元数据)?

我有一个包含多个图像和视频的图库文件夹,其中一些的修改日期正确,有些的月份错误。我想制作一个脚本,该脚本将更改某个文件夹中的所有文件,修改月份为一月到六月(或任何其他类似的组合)示例:

我的图像日期如下(EXIF 元数据不是名称):

05-Jan-2011
06-Jan-2011
07-Jan-2011

ETC...

我想保持年份和日期相同,但仅将所有月份更改为六月而不是一月。

所以它们变成了(EXIF 元数据而不是名称):

05-Jun-2011
06-Jun-2011
07-Jun-2011

ETC....

我怎样才能做到这一点 ?

提前致谢。

答案1

更新:如果我的答案有误,请立即告诉我。

我不确定file system's modification date元数据是否等同于exitf modification date元数据。我进行了测试exiftool,日期是相同的,所以这让我觉得我可以用来touch操作该元数据。

解决方案:

首先,您应该使用命令获取文件的修改日期stat

filedate=$(stat -c '%y' "/path/to/file" | cut -d' ' -f1)

现在该月份将被另一个月份取代。为此,您可以使用 awk:

newDate=$(awk -v month="Jun" -F '-' '{print $1"-"month"-"$3}' <<< $filedate )

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

touch -m -d $newDate /path/to/file
#-m argument is used to change modification time
#-d is used to specify the new date

最后,如果您想递归地更改文件,您可以使用find之前提供的代码应位于脚本文件中:

脚本.sh:

#! /usr/bin/env bash

filedate=$(stat -c '%y' "$1" | cut -d' ' -f1)

newMonth="Dec" #here you specify the month 
newDate=$(awk -v month=$newMonth -F '-' '{print $3"-"month"-"$1}' <<< $filedate )

touch -m -d $newDate $1

并且find您可以使用:

find /path/to/your_directory -type f -exec ./script.sh {} \;

如果要在 find 命令中指定月份,可以将其作为参数传递给 script.sh:

因此,代码现在变为:

脚本文件

#! /usr/bin/env bash

filedate=$(stat -c '%y' "$1" | cut -d' ' -f1)

newMonth="$2"
newDate=$(awk -v month=$newMonth -F '-' '{print $3"-"month"-"$1}' <<< $filedate )

touch -m -d $newDate $1

查找命令

find . -type f -exec ./script {} "Nov" \;

相关内容