Shell

執行“find”並將輸出通過管道傳輸到“wc”/“sort”,在外部“find -exec”內

  • September 20, 2015

我有一個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問題,我需要快速辨識肯定存在同步問題的郵箱。基本上,我只需要計算每個一級文件夾中儲存的文件數

由於我是“發現是一個很棒的程序。了解它! ”概念的粉絲,我的第一個猜測是:

[**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 {} ;" \;

但它沒有奏效,可能是因為需要以{}相反的順序擴展(第一次出現{}由 second 擴展find;第二次出現{}由 first 擴展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。無論如何,歡迎每一個提示/建議)

我建議您告訴在哪裡可以找到排序鍵,而不是嘗試使嵌套的findoneliner 的輸出適應預設行為:sort``sort

... | sort -t: -k2n

這當然是假設您的第一級目錄名稱都不包含冒號。

引用自:https://serverfault.com/questions/723560