Existe uma maneira de forçar du a relatar um tamanho de diretório (recursivamente) incluindo apenas tamanhos de arquivos?

3

Suponha que eu crie um diretório test/ , com dois arquivos ( test/a , test/b ) e um diretório interno test/c com um arquivo test/c/d , assim:

mkdir test
cd test
touch a
echo 1 > a
touch b
echo 1 > b
mkdir c
cd c
touch d
echo 1 > d
cd ../..
du test -ab

A saída da última linha (executando du ) é:

2       test/a
4096    test/c
2       test/b
8196    test

O tamanho do diretório é 8196 (em vez de 6, que seria: tamanho do arquivo a + tamanho do arquivo b + tamanho do arquivo c / d). Isso porque, como eu entendo, du inclui o tamanho dos próprios diretórios (porque um diretório é apenas um arquivo especial, que registra entradas de arquivo).

Eu não quero isso. Eu quero ver o tamanho combinado de todos os arquivos em um diretório (a maneira como o Windows Explorer relata o tamanho do diretório). Então, neste exemplo, o resultado deve ser:

2       test/a
2       test/c
2       test/b
6       test

Mais importante, o que eu realmente quero é a última linha: a soma dos tamanhos de todos os arquivos no diretório (recursivamente).

Mas eu passei por todas as opções de du, e não parece haver uma maneira de fazer isso. Existe alguma maneira?

    
por Kipras 20.12.2011 / 16:47

3 respostas

1
$ ls -goR | awk '{sum += $3} END{print sum}'
16992

Editar. Para excluir diretórios, use grep

$ ls -goR | grep -v ^d | awk '{sum += $3} END{print sum}'
6
    
por 20.12.2011 / 16:55
2

Se tudo o que você quer é o tamanho dos arquivos, excluindo o espaço ocupado pelos diretórios, você pode fazer algo como

$ find test/ -type f -print0 | xargs -0 du -scb | awk '/total/{k+=$1}END{print k" total"}'
6   total
    
por 02.06.2013 / 18:58
0

Você especifica que deseja um resumo de arquivos dentro de um diretório, mas sua saída de exemplo inclui arquivos específicos.

Para detalhes, incluindo arquivos específicos, tente isto:

$ find test/ -exec du -s {} \;

20      test/
4       test/b
4       test/a
8       test/c
4       test/c/d

Para apenas um resumo de cada diretório, tente isto:

$ find test/ -type d -exec du -s {} \;

20      test/
8       test/c

Espero que isso seja útil para você?

    
por 20.12.2011 / 17:30

Tags