我有一个文件夹imapsync来存储自己的缓存。这样的文件夹包含我正在同步的每个邮箱的子文件夹,仅此而已:
[dv@monitor] find * -maxdepth 0 -type d | wc -l
126
[dv@monitor] find * -maxdepth 0 | wc -l
126
每个子文件夹复制相关用户/邮箱的邮箱结构(注意:imapsync
跟踪目标邮件服务器,因此它还添加了对它的引用,作为附加文件夹结构保存:10.0.1.235
在下面的示例中)。
[dv@monitor] find director -type d
director
director/10.0.1.235
director/10.0.1.235/director
director/10.0.1.235/director/Deleted Items
director/10.0.1.235/director/Deleted Items/Deleted Items
director/10.0.1.235/director/Contacts
director/10.0.1.235/director/Contacts/Contacts
[....]
director/10.0.1.235/director/INBOX
[...]
每个子文件夹内imapsync
为每条同步的消息存储一个文件:
[dv@monitor] ls -l segreteria/10.0.1.235/segreteria/INBOX/INBOX | head -n 10
totale 0
-rw-r--r-- 1 root root 0 19 set 23:36 1000_109
-rw-r--r-- 1 root root 0 19 set 23:36 10009_1342
-rw-r--r-- 1 root root 0 19 set 23:36 10011_1343
-rw-r--r-- 1 root root 0 19 set 23:36 10013_1344
-rw-r--r-- 1 root root 0 19 set 23:36 10028_1345
-rw-r--r-- 1 root root 0 19 set 23:36 10042_1346
-rw-r--r-- 1 root root 0 19 set 23:36 10046_1347
-rw-r--r-- 1 root root 0 19 set 23:36 10048_1348
-rw-r--r-- 1 root root 0 19 set 23:36 10050_1349
现在,我正在解决imapsync
问题,我需要快速识别肯定存在同步问题的邮箱。基本上,我只需要计算每个第一级文件夹中存储的文件数量。
因为我是“find 是一款很棒的程序。学习一下吧!“概念,我的第一个猜测是这样的:
[**NOT WORKING**] find * -type d -maxdepth 0 -exec 'find {} -type f | wc -l' \;
但它没有用。
经过 30 多分钟的互联网搜索和学习,甚至阅读另一个 StackOverflow 帖子,我(稍微)成功了:
find * -maxdepth 0 -type d -exec sh -c "echo -n {} ; echo -n : ; find {} -type f | wc -l" \;
请注意,在上面,find
第一个{}
通过第一级文件夹名称正确扩展,而第二个{}
通过其中包含的每个文件正确扩展。
不幸的是,输出的形式<mailbox>:<number_of_messages>
如下:
director:25
sv:25
segreteria:11532
registration:146
newsletter:240
我仍然缺少的是sort
基于消息数量的简单输出形式。如果输出被反转(<number_of_messages>:<mailbox>
),则简单如下:
.... | sort -n
可以解决我的需求,仅含 9 个额外角色。
echo
所以我尝试改变嵌套的 内部的顺序find
。例如:
[**not working**] find * -type d -maxdepth 0 -exec sh -c "find {} -type f | wc -l ; echo -n : ; echo -n {} ;" \;
但它不起作用,可能是因为需要{}
按相反的顺序扩展(第一次出现被{}
第二次扩展find
;第二次出现被{}
第一次扩展find
)。
因此,经过以上所有介绍,有人可以指出我如何调整这个(正常工作的)单行代码:
find * -maxdepth 0 -type d -exec sh -c "echo -n {} ; echo -n : ; find {} -type f | wc -l" \;
以这样的方式反转输出(<number>:<mailbox>
或者甚至更好<number><space><mailbox>
)?
(PS:显然有很多方法可以实现这个目标。至于我自己,我可以轻松地执行 3/4 行 perl 脚本来拆分/反转每行的输出。我对需要“稍微增加”字符的解决方案感兴趣;类似于| sort -n
。无论如何,欢迎提出任何提示/建议)
答案1
我建议您告诉在哪里可以找到排序键,而不是尝试使嵌套的单行代码的输出find
适应的默认行为:sort
sort
... | sort -t: -k2n
当然,这是假设您的第一级目录名称都不包含冒号。