Solução
Ao fornecer a opção -c
(ou --total
) para du(1)
, você pode instruí-la a produzir um total geral. Se sua implementação de du(1)
suportar alguma dessas opções, você poderá obter o efeito desejado usando o seguinte comando:
$ find . -name 'flibble*' -ctime +90 -exec du -shc {} +
EDIT: Observe que, se o número de arquivos exceder o número máximo de parâmetros permitido pelo seu sistema, find
ainda poderá ser executado command
várias vezes. Algumas implementações du(1)
também suportam a leitura dos nomes de arquivos de um arquivo, que não sofre a limitação mencionada:
$ find -name 'flibble*' -ctime +90 -print0 > filenames
$ du -shc --files0-from=filenames
Explicação
A diferença entre a semântica de -exec command {} \;
e -exec command {} +
é a seguinte:
command {} \;
executa command
uma vez para cada resultado de find
. O nome do caminho do resultado é passado em vez de {}
.
$ touch 1 2 3
$ find 1 2 3 -maxdepth 0 -exec echo {} \;
1
2
3
command {} +
executa command
, quando todos os resultados foram recuperados. Os nomes dos caminhos dos resultados são passados em vez de {}
.
$ touch 1 2 3
$ find 1 2 3 -maxdepth 0 -exec echo {} +
1 2 3
A -print0
opção faz find(1)
com que os nomes de arquivos encontrados sejam impressos na saída padrão separada pelo caractere nulo, e a --files0-from
opção causou du(1)
a leitura dos nomes de arquivos separados por nulo. Diferentemente do novo caractere de linha, o caractere nulo pode não aparecer em um nome de arquivo, portanto, a saída é inequívoca.
Para saber mais sobre as opções de du(1)
e find(1)
, você deve consultar as respectivas páginas de manual:
$ man du
$ man find