Mostra a soma dos tamanhos dos arquivos na listagem de diretórios

52

O comando de listagem de diretório dir do Windows tem uma linha no final que mostra a quantidade total de espaço ocupada pelos arquivos listados. Por exemplo, dir *.exe mostra todos os arquivos .exe no diretório atual, seus tamanhos e a soma total de seus tamanhos. Eu adoraria ter funcionalidade semelhante com meu dir alias no bash, mas não sei exatamente como fazer isso.

Atualmente, tenho alias dir='ls -FaGl' no meu .bash_profile , mostrando

drwxr-x---+  24 mattdmo  4096 Mar 14 16:35 ./
drwxr-x--x. 256 root    12288 Apr  8 21:29 ../
-rw-------    1 mattdmo 13795 Apr  4 17:52 .bash_history
-rw-r--r--    1 mattdmo    18 May 10  2012 .bash_logout
-rw-r--r--    1 mattdmo   395 Dec  9 17:33 .bash_profile
-rw-r--r--    1 mattdmo   176 May 10  2012 .bash_profile~
-rw-r--r--    1 mattdmo   411 Dec  9 17:33 .bashrc
-rw-r--r--    1 mattdmo   124 May 10  2012 .bashrc~
drwx------    2 mattdmo  4096 Mar 24 20:03 bin/
drwxrwxr-x    2 mattdmo  4096 Mar 11 16:29 download/

por exemplo. Tomando as respostas de esta pergunta :

dir | awk '{ total += $4 }; END { print total }'

que me dá o total, mas não imprime o diretório propriamente dito. Existe uma maneira de alterar isso em um one-liner ou shell script para que eu possa passar qualquer ls argumentos que eu quero dir e obter uma listagem completa mais soma total? Por exemplo, eu gostaria de executar dir -R *.jpg *.tif para obter a listagem e o tamanho total desses tipos de arquivo em todos os subdiretórios. Idealmente, seria ótimo se conseguisse o tamanho de cada subdiretório, mas isso não é essencial.

    
por MattDMo 16.04.2013 / 20:38

10 respostas

21

A seguinte função faz a maior parte do que você está pedindo:

dir () { ls -FaGl "${@}" | awk '{ total += $4; print }; END { print total }'; }

... mas não lhe dará o que você está pedindo de dir -R *.jpg *.tif , porque não é assim que ls -R funciona. Você pode querer brincar com o utilitário find para isso.

    
por 16.04.2013 / 20:59
112

Já existe um comando do UNIX para isso: du

Basta fazer:

du -ach 

De acordo com a convenção, você pode adicionar um ou mais caminhos de arquivo ou diretório no final do comando. -h é uma extensão para converter o tamanho em um formato amigável, -a lhe dá o tamanho "aparente" (tamanho do arquivo em vez do uso do disco), e -c dá um total no final.

    
por 19.04.2013 / 01:07
12

Você pode usar du -h -c directory|tail -1

Isso gerará uma única linha com o uso da memória.

    
por 09.02.2015 / 11:30
8

Basta imprimir a linha atual em que você está somando o total de:

dir | awk '{ print; total += $4 }; END { print "total size: ",total }'
    
por 16.04.2013 / 20:56
6

com perl:

perl -le 'map { $sum += -s } @ARGV; print $sum' -- *.pdf

Tamanho de todos os arquivos PDF não ocultos no diretório atual.

    
por 04.08.2014 / 12:57
1

Adicionando o seguinte para .bash_profile ou .bashrc funciona para mim.

dir ()
{
find . -iname "$@" -exec ls -lh {} \;
find . -iname "$@" -print0|xargs -r0 du -csh|tail -n 1;
}

Agora, quando eu faço um dir * .mp3 ele faz recursivamente e imprime total no final. Você pode controlar a profundidade que deseja adicionando um parâmetro maxdepth ao find. Eu sei que correr duas vezes não é uma idéia muito eficiente. Mas eu não conseguia pensar em um jeito melhor. Pelo menos, faz o trabalho.

    
por 17.04.2013 / 22:17
1

Usar du e uma instrução awk como a mencionada acima fornecerão o que você está procurando.

Exemplo: du /home/abc/Downloads/*.jpg | awk '{ print; total += $1 }; END { print "total size: ",total }'

Isso listará todos os arquivos na pasta Downloads do usuário abc que terminam em .jpg e imprime a soma de todos esses arquivos no final da listagem.

    
por 07.01.2014 / 21:00
0

Para obter ambos, saída dir e cálculo de tamanho, sem usar nenhuma das outras opções propostas, você pode usar tee (1) e processar substituição ...

dir | tee >( awk '{ total += $4 }; END { print total }' )
    
por 09.02.2015 / 13:56
-2
du * | awk -v sum=0 '{print sum+=$1}' | tail -1
    
por 03.06.2015 / 23:16
-2
du path_to_your_files/*.jpg | awk '{ total += $1 }; END { print total }'
    
por 26.08.2015 / 20:32