根据文件名更改文件时间戳的脚本

根据文件名更改文件时间戳的脚本

我在 macOS 环境中。

我想更改名称以此格式开头的多个文件的时间戳:

XXXXX_DD_MM_YYYY_HH-MM-SS_

这是文件名的示例:

CALLU_16-10-2018_10-58-26_p123456789012.mp3

创建和修改日期应更改为2018年10月16日10:58:26。

我有以下表单文件名的脚本Call@1234567890(1234567890)_20160624205913。它从文件名末尾提取日期和时间,作为以下参数touch -t STAMP

for f in *; do
    t="$(awk '/_.*/ { match($0, /_.*/)
                      print substr($0, RSTART + 1, RLENGTH - 7)
                    }'<<<"$f" )"
    touch -t "$t" "$f" 2>/dev/null
done

答案1

老问题

您的旧awk脚本正在搜索_文件名中的第一个字符,然后使用从下一个字符 ( RSTART+1) 到结尾之前的 6 个字符 ( RLENGTH-7: +1-7 = -6) 的所有内容。

在您的输入文件名上,将产生20160624,即。只有日期,没有时间。来自touch规格:

选项参数应为以下形式的十进制数:

[[CC]YY]MMDDhhmm[.SS]

其中每两位数字代表以下内容:

MM
 The month of the year [01,12].
DD
 The day of the month [01,31].
hh
 The hour of the day [00,23].
mm
 The minute of the hour [00,59].
CC
 The first two digits of the year (the century).
YY
 The second two digits of the year.
SS
 The second of the minute [00,60]. 

...这意味着,只有 8 位数字,“20”被解释为月份,即。无效日期。但是您不会touch因为2>/dev/null.

您将需要添加 4 个以上的字符(以提供hhmm),例如使用。RLENGTH-3。但这仅对旧文件名有用。

新问题

在您的 filename 中CALLU_16-10-2018_10-58-26_p123456789012.mp3,日期16-10-2018采用小端顺序 (DD-MM-CCYY),因此您的awk脚本需要交换组件,并删除所有分隔符:

awk -F '[-_]' '{print $4$3$2$5$6"."$7}'

(如果您的输入文件名-在日期之前包含其他字符,则需要采取进一步的步骤来首先提取 s 之间的部分_。)

使用您的示例文件对此进行测试:

$ echo 'CALLU_16-10-2018_10-58-26_p123456789012.mp3' | awk -F '[-_]' '{print $4$3$2$5$6"."$7}'
201810161058.26

因此,您更新后的脚本可能类似于:

for f in *.mp3; do
    t=$(echo "$f" | awk -F '[-_]' '{print $4$3$2$5$6"."$7}')
    touch -t "$t" "$f"
done

相关内容