執行“find”並將輸出通過管道傳輸到“wc”/“sort”,在外部“find -exec”內
我有一個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
。無論如何,歡迎每一個提示/建議)
我建議您告訴在哪裡可以找到排序鍵,而不是嘗試使嵌套的
find
oneliner 的輸出適應預設行為:sort``sort
... | sort -t: -k2n
這當然是假設您的第一級目錄名稱都不包含冒號。