Назад | Перейти на главную страницу

Запуск «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 проблемы, мне нужно быстро определить почтовые ящики, у которых наверняка были проблемы с синхронизацией. В принципе, Мне просто нужно подсчитать количество файлов, хранящихся в каждой из папок первого уровня..

Поскольку я фанат "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

Это, конечно, предполагает, что ни одно из имен каталогов первого уровня не содержит двоеточия.