Executando “find” e canalizando a saída para “wc” / “sort”, dentro de um “find -exec” externo

1

Eu tenho uma pasta usada pelo imapsync para armazenar seu próprio cache. Essa pasta contém uma subpasta para cada caixa de correio que estou sincronizando e nada mais:

[dv@monitor] find * -maxdepth 0 -type d | wc -l
126
[dv@monitor] find * -maxdepth 0  | wc -l
126

Todas as subpastas replicam a estrutura da caixa de correio do usuário / caixa de correio relacionado ( nota: imapsync mantém o controle do servidor de e-mail de destino, portanto também adiciona uma referência a ele, mantida como uma estrutura de pastas adicional: 10.0.1.235 nos exemplos abaixo ).

[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
[...]

Dentro de cada subpasta imapsync armazena um arquivo para cada uma das mensagens sincronizadas:

[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

Agora, como estou solucionando problemas imapsync , preciso identificar rapidamente caixas de correio que certamente tiveram problemas com a sincronização. Basicamente, eu simplesmente preciso contar o número de arquivos armazenados em cada uma das pastas de primeiro nível .

Como eu sou fã do " encontrar é um ótimo programa. Aprenda sobre isso! " conceito, meu primeiro palpite foi algo como:

[**NOT WORKING**] find * -type d -maxdepth 0 -exec 'find {} -type f | wc -l' \;

mas não funcionou.

Após mais de 30 minutos de pesquisa e aprendizagem baseadas na Internet, e mesmo depois de ler este outro post do StackOverflow , eu tive (levemente) sucesso com:

find * -maxdepth 0 -type d -exec sh -c "echo -n {} ; echo -n : ; find {} -type f | wc -l" \;

Observe que, no find acima, o primeiro {} foi expandido corretamente pelo nome da pasta de primeiro nível, enquanto o segundo {} foi expandido corretamente com cada arquivo contido aqui.

Infelizmente, a saída está no formato <mailbox>:<number_of_messages> como:

 director:25
 sv:25
 segreteria:11532
 registration:146
 newsletter:240

O que eu ainda sentia falta era um formulário trivial para sort da saída, com base no número de mensagens. Se a saída for invertida ( <number_of_messages>:<mailbox> ), um simples:

 .... | sort -n

teria resolvido minhas necessidades, com apenas 9 caracteres adicionais .

Então, tentei alterar a ordem do echo dentro do aninhado find . Algo como:

[**not working**] find * -type d -maxdepth 0 -exec sh -c "find {} -type f | wc -l ; echo -n : ; echo -n {} ;" \;

mas não funcionou, provavelmente devido à necessidade de expandir {} na ordem inversa (primeira ocorrência de {} sendo expandida pela segunda find ; segunda ocorrência de {} sendo expandida pela primeira find ).

Então, depois de toda a introdução acima, alguém pode me indicar como adaptar essa linha de trabalho (trabalhando corretamente):

find * -maxdepth 0 -type d -exec sh -c "echo -n {} ; echo -n : ; find {} -type f | wc -l" \;

de maneira a reverter a saída ( <number>:<mailbox> ou, melhor ainda, <number><space><mailbox> )?

(PS: obviamente há muitas maneiras de atingir esse objetivo. Quanto a mim, não teria problema em disparar um script perl de 3/4 linhas para dividir / reverter a saída de cada linha. Estou interessado em soluções que exigem uma "pequena adição" de caracteres; algo como | sort -n . De qualquer forma, todas as sugestões / sugestões são bem-vindas)

    
por Damiano Verzulli 20.09.2015 / 11:49

1 resposta

1

Em vez de tentar adaptar a saída de seu onliner find aninhado ao comportamento padrão de sort , proponho que você informe sort onde encontrar a chave de classificação:

... | sort -t: -k2n

Isto é claro, assumindo que nenhum dos seus nomes de diretório de primeiro nível contém dois pontos.

    
por 20.09.2015 / 17:50