运行“find”并将输出通过管道传输到外部“find -exec”内的“wc”/“sort”

运行“find”并将输出通过管道传输到外部“find -exec”内的“wc”/“sort”

我有一个文件夹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适应的默认行为:sortsort

... | sort -t: -k2n

当然,这是假设您的第一级目录名称都不包含冒号。

相关内容