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

标签 linux timestamp imap synchronization

我没有从 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 提示。很有用,可以放点像我一样用代码代替 stat使用 e 修饰符。

当您的测试有效时,您可以删除 -n(试运行模式开关)。

warning 有其他同名工具可能无法执行此操作,所以要小心。

如果你运行下面的命令(linux)

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

你有一个类似的结果

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

不包含:

ELF

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

如果不是,让它成为 DebianUbuntu 等衍生产品的默认设置(通常已经是这样):

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

(将 /path/to/rename 替换为您的 perl 的 rename 命令的路径。


如果你没有这个命令,搜索你的包管理器来安装它或者 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,应该也可以)

关于linux - 如何重命名以 Unix 时间戳开头的多个文件 - imapsync 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15468028/

相关文章:

Javamail 性能

c++ - 实现 posix 消息队列时出错 - "Function not implemented"

linux - 变量在 sed 内的 shell 脚本中不起作用

java - 在java中将日期转换为纳秒

datetime - 如何使用 Emacs 将当前日期和时间插入到文件中?

c# - MailKit 搜索 IMAP 电子邮件来自特定的 UID

linux - 如果 CPU 平均负载很高会发生什么

c++ - 在 Linux (Debian) 中访问文本屏幕内存

php - 在 PHP 中更改时区不起作用

c# - 将数据导入 Outlook.com