我在 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 个以上的字符(以提供hh
和mm
),例如使用。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