linux – 如何重命名以Unix时间戳开头的多个文件 – imapsync问题

提问

我没有从imapsync获取脚本来重命名maildir文件名工作. : – /

所以我需要的是:

我有一个包含数千封邮件的邮件文件夹.将这些电子邮件导入我的新服务器后,电子邮件的文件名将创建日期作为文件名中的Unix时间戳记,但文件的创建日期标志是电子邮件中的正确接收日期.

ls -l对于一个文件看起来像这样:

-rw-r--r-- 1 popuser popuser  1350432 2013-03-16 07:22 1363563215.M562903P29332V0000000000000802I0000000000AEA46B_527.my-domain.org,S=1350432:2,S

那么脚本必须做的是:
1)读取文件的创建日期/时间(我找到了命令

stat -c %y filename

做这个)

2)将日期/时间从1)转换为Unix时间戳

date -d "2013-03-17 11:19:01.000000000 +0100" "+%s"

3)删除文件名的前10位数(错误的时间戳),然后删除2)中的时间戳

4)对特定目录中的所有文件执行此操作

我是Linux脚本的新手,任何人都可以帮我这个脚本吗?

谢谢!

最佳答案

尝试使用rename执行此操作:

$rename -n 's/^\d+/(stat($_))[9]/e' [0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]*

从shell提示符.它非常有用,您可以像使用e修饰符替换stat那样添加一些perl代码.
当测试成为valid时,您可以删除-n(干运行模式开关).

warning http://pix.toile-libre.org/upload/original/1377510865.png还有其他同名工具,可能会也可能不会这样做,所以要小心.

如果运行以下命令(linux)

$file $(readlink -f $(type -p rename))

你有一个结果

.../rename: Perl script, ASCII text executable

并且不包含:

ELF

那么这似乎是正确的工具=)

如果没有,为了使它成为Debian上的默认(通常已经是这种情况)和Ubuntu这样的派生:

$sudo update-alternatives --set rename /path/to/rename

(将/ path / to / rename替换为perl重命名命令的路径.

如果您没有此命令,请搜索包管理器以安装它或do it manually

最后但并非最不重要的是,这个工具最初是由Perl的父亲Larry Wall编写的.

编辑

here所述,如果您有以下错误:

Argument list too long

然后使用find这样:

find -type f -name '[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]*' -print0|
    xargs -0 -n1 rename -n 's/^\d+/(stat($_))[9]/e' 

(尝试没有-n1,这也应该有效)