我有以下bash脚本来更新maildir文件的mtime:
#!/bin/bash
for i in /test/emailfile
do
date=$(sed -n '/Received: from/ { :a; n; /;/ {s/.*; //p;q}; b a }' "$i")
newdate=$(date -d "$date" +'%Y%m%d%H%M.%S')
touch -t "$newdate" "$i"
done这个脚本一直运行得很好,标准的头文件如下:
Delivery-date: Sun, 22 Apr 2007 00:15:13 -0600
Received: from an-out-0708.google.com ([209.85.132.243])
by x.xxxx.com with esmtp (Exim 4.63)
(envelope-from <xxxxxx@gmail.com>)
id 1HfVLs-0002Io-RQ
for x@xxxxx.com; Sun, 22 Apr 2007 00:15:13 -0600它的交付日期是2007年。如果我触摸该文件,因此文件日期是今天的日期,然后运行我的脚本,则文件日期将恢复为接收自日期。
但是,当尝试在具有以下标题的电子邮件上运行我的脚本时:
Delivery-date: Mon, 15 Dec 2008 17:26:37 -0800
Received: from xxxxxx ([130.194.13.165])
by xxxxxxx with esmtp (Exim 4.69)
(envelope-from <xxxxxi@xxxxx.xxx.xx>)
id 1LCOhp-0006fm-2g
for xxxxx@xxxxxx.com; Mon, 15 Dec 2008 17:26:37 -0800日期显然没有恢复。我看不出头部有任何明显的不同。我需要重置mtime,因为许多邮件客户端使用filetime将其显示为接收自时间。我的脚本已经在3000多封电子邮件上工作,确保所有客户端在移动服务器和所有具有相同日期的文件后以正确的顺序显示电子邮件,但由于某些原因,它不会在特定的电子邮件上工作。我是否在脚本中遗漏了一些显而易见的东西?
编辑:日期显然是从脚本恢复的,但是,无论脚本将日期设置为什么,依赖mtime的客户端都不会显示此消息。权限是相同的,就像布局和文件名格式一样。以下是ls -la的帖子
-rw-rw---- 1 username username 11769 Dec 14 21:25 1229318728.H329820P11297.xxxxx.serverxxxxx.com:2,S
-rw-rw---- 1 username username 3366 Dec 15 17:26 1229390797.H476913P25671.xxxxx.serverxxxxx.com:2,S
-rw-rw---- 1 username username 1149 Dec 22 05:39 1229953142.H901034P11016.xxxxx.serverxxxxx.com:2,S
-rw-rw---- 1 username username 7557 Dec 23 15:43 1230075791.H700954P8392.xxxxx.serverxxxxx.com:2,S无法正确显示的文件是从顶部开始的第二个文件。有没有办法调试为什么会发生这种情况?
发布于 2009-01-22 11:47:13
它似乎对我来说很好,试试这个小曲子,看看你会得到什么。
#!/bin/bash
echo 'Delivery-date: Sun, 22 Apr 2007 00:15:13 -0600
Received: from an-out-0708.google.com ([209.85.132.243])
by x.xxxx.com with esmtp (Exim 4.63)
(envelope-from <xxxxxx@gmail.com>)
id 1HfVLs-0002Io-RQ
for x@xxxxx.com; Sun, 22 Apr 2007 00:15:13 -0600' | sed -n '/Received: from/ { :a; n; /;/ {s/.*; //p;q}; b a }'
date -d "Sun, 22 Apr 2007 00:15:13 -0600" +'%Y%m%d%H%M.%S'
echo 'Delivery-date: Mon, 15 Dec 2008 17:26:37 -0800
Received: from xxxxxx ([130.194.13.165])
by xxxxxxx with esmtp (Exim 4.69)
(envelope-from <xxxxxi@xxxxx.xxx.xx>)
id 1LCOhp-0006fm-2g
for xxxxx@xxxxxx.com; Mon, 15 Dec 2008 17:26:37 -0800' | sed -n '/Received: from/ { :a; n; /;/ {s/.*; //p;q}; b a }'
date -d "Mon, 15 Dec 2008 17:26:37 -0800" +'%Y%m%d%H%M.%S'我得到(不出所料):
Sun, 22 Apr 2007 00:15:13 -0600
200704221415.13
Mon, 15 Dec 2008 17:26:37 -0800
200812161026.37因此,我不确定为什么您的脚本不能工作,尽管该脚本的输出应该是一个很好的起点。
您可以做的另一件事是临时修改您的脚本,如下所示:
: : : : :
echo touch -t "$newdate" "$i"
touch -t "$newdate" "$i"
: : : : :这将输出您正在尝试的实际命令。
还要检查目录和单个文件的文件权限。
"ls -l“(mtime)和"ls -lc”(ctime)对实际可疑邮件文件有什么帮助?可能是您的脚本运行正常,但用户的电子邮件客户端没有使用mtime/ctime。
编辑后:
引用“然而,无论脚本将日期设置为什么,依赖mtime的客户端都不会显示此消息”,我的回答是客户端不是依赖mtime的。
套用夏洛克本人的话说,一旦你排除了所有其他可能性,剩下的一切,无论多么不可能,都肯定是这种情况。我注意到一件事:你刚才是不是说消息根本没有显示出来(或者我以为我们说的日期是错的)?
如果是后者,您需要查看邮件客户端,以查看它实际从何处获取日期。出于兴趣,客户端认为它是什么日期(它是否与标题中的任何日期匹配?
如果是前者,那就是我们可以讨论的另一个问题。
我认为这就是你需要从这里开始的(客户端),由于我的专业知识更多的是脚本而不是电子邮件客户端,我可能无法提供进一步的帮助。尽管如此,我还是很有兴趣看看结果如何,所以我最喜欢这个问题。
发布于 2011-02-25 03:34:18
以下脚本使用邮件消息的日期而不是接收日期属性。这会将日期设置为与某些邮件应用程序使用的日期相匹配,并简化sed语句。它还包括在遇到错误/无效日期时改进的错误处理。
#!/bin/bash
echo "Process folder : $@"
for i in $( ls -1 $@ )
do
# date=$(sed -n '/Received: from/ { :a; n; /;/ {s/.*; //p;q}; b a }' "$i")
# date=$(sed -n -f ~/scripts/fix.sed "$i")
date=$(sed -n '/^Date: / {s/^Date: //p;q}' "$i")
newdate=$(date -d "$date" +'%Y%m%d%H%M.%S')
returnCode=$?
if [ "$returnCode" != "0" ]
then
echo "Date Return Code : $returnCode"
echo "Message file : $i received at : $date"
fi
touch -c -t "$newdate" "$i"
done发布于 2009-01-22 11:45:45
你确定吗--它对我很有效。
我所做的唯一更改是:
#!/bin/bash
for i in "$@"
do
date=$(sed -n '/Received: from/ { :a; n; /;/ {s/.*; //p;q}; b a }' "$i")
newdate=$(date -d "$date" +'%Y%m%d%H%M.%S')
touch -c -t "$newdate" "$i"
donetouch -c,这样文件就不会通过触摸来创建。
for i in "$@",以便它在命令行参数上运行,而不是在固定文件上运行。
$ touch data2 ; ls -l data2
-rw-r--r-- 1 leeder leeder 250 2009-01-22 11:43 data2
$ bash test.sh data data2 ; ls -l data2
-rw-r--r-- 1 leeder leeder 250 2008-12-16 01:26 data2https://stackoverflow.com/questions/468704
复制相似问题