我有followign bash脚本来更新maildir文件的mtimes:
#!/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
日期显然没有恢复。我看不出标题明显不同。我需要重置mtimes,因为许多邮件客户端使用文件时间显示为从时间接收。我的脚本已经处理了超过3000封电子邮件,确保所有客户端在移动服务器和所有具有相同日期的文件时以正确的顺序显示电子邮件,但由于某种原因,它不适用于特定的电子邮件。我是否在剧本中留下了明显的东西?
编辑:显然从脚本中恢复了日期,但是无论脚本将日期设置为什么,依赖于mtimes的客户端都不会显示此消息。权限与布局和文件名格式相同。以下是来自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
无法正确显示的文件是从顶部开始的第二个文件。有没有办法调试为什么会发生这种情况?
答案 0 :(得分:1)
它似乎对我来说很好,尝试这个小曲子,看看你得到了什么。
#!/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。
编辑后:
引用“但是,无论脚本将日期设置为什么,依赖于mtimes的客户端都不会显示此消息”,我的回答是客户端不依赖于mtimes。
对Sherlock本人进行解释,一旦你消除了所有其他可能性,无论剩下什么,无论多么不可能,都必须如此。有一件事我注意到了:你刚才说这条消息根本没有显示(或者说它的日期错误,正如我以为我们所说的那样)?
如果是后者,您需要查看邮件客户端以查看其实际获取日期的位置。只是出于兴趣,客户认为它是什么日期(它是否与标题中的任何日期匹配?
如果是前者,我们可以讨论这个问题。
我认为(客户端)你需要离开这里,因为我的专业知识更多地是脚本而不是电子邮件客户端,所以我可能无法进一步提供帮助。不过,我很想知道结果如何,所以我会更喜欢这个问题。
答案 1 :(得分:1)
以下脚本使用Date而不是邮件消息的Received Date属性。这将日期设置为与某些邮件应用程序使用的日期相匹配,并简化了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
答案 2 :(得分:0)
你确定 - 它对我有用。
我所做的唯一改变是:
#!/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"
done
touch -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 data2