У меня есть папка, которую использует 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: очевидно, есть много способов достичь этой самой цели. Что касается меня, у меня не было бы проблем с запуском perl-скрипта на 3/4 строки для разделения / реверсирования вывода каждой строки. Меня интересуют решения это потребует "небольшого добавления" символов; что-то вроде | sort -n
. В любом случае любые подсказки / предложения приветствуются)
Вместо того, чтобы пытаться адаптировать вывод вложенного find
oneliner к поведению по умолчанию sort
Предлагаю вам рассказать sort
где найти ключ сортировки:
... | sort -t: -k2n
Это, конечно, предполагает, что ни одно из имен каталогов первого уровня не содержит двоеточия.