您不能在不更改时间戳的情况下修改文件;但是您可以保留原始时间戳并将其应用回来touch
,如单独的答案中所示。
找到损坏的Date:
标头也不是太难,特别是如果消息是由一小组客户端发送的,这些客户端都以相同的方式统一损坏。但是,您可以在野外发现许多不同的 RFC 违规行为,因此在继续修改之前,可能会执行测试运行以提取所有 Date: 不符合预期格式的标头。
find Maildir -type f -exec sh -c 'for f; do
sed -n "/^\$/q;/^[Dd][Aa][Tt][Ee]:/p" "$f"; done' _ {} +
这-exec ... +
是一个 GNU 扩展,它模仿xargs
它会将尽可能多的找到的文件作为参数传递给由-exec
.
[Dd][Aa][Tt][Ee]:
您可以在搜索与特定错误Date:
格式匹配的日期标题之后扩充正则表达式。
如果您可以验证所有错误消息都与您的样本相似,
sed -i '1,/^$/!b;s/^\([Dd][Aa][Tt][Ee]: [A-Z][a-z][a-z], [ 0-3][0-9] [A-Z][a-z][a-z] \)\([7-9][0-9] \)/\119\2/;s/^\([Dd][Aa][Tt][Ee]: [A-Z][a-z][a-z], [ 0-3][0-9] [A-Z][a-z][a-z] \)\([01][0-9] \)/\120\2/'
可能至少是修复错误消息的良好开端。
把所有东西放在一起,最终的脚本可能看起来像
find Maildir -type f -exec sh -c 'for f; do
timestamp=$(stat -c "%y" "$f")
sed -i "1,/^\$/!b;s/^\(Date: [A-Z][a-z][a-z], [ 0-3][0-9] [A-Z][a-z][a-z] \)\([7-9][0-9] \)/\119\2/;s/^\(Date: [A-Z][a-z][a-z], [ 0-3][0-9] [A-Z][a-z][a-z] \)\([01][0-9] \)/\120\2/" "$f"
touch -d "$timestamp" "$f"
done' _ {} +
我的预测是,sed
如果您需要处理来自 Lotus、Yahoo! 和 Microsoft 等智力创造力据点的数十年错误邮件客户端,您的最终脚本将需要相当复杂。最讨厌的可能是那些本地化不正确的地方——你可能会猜到Märtz是三月,但祝你好运marraskuu或十一月......