Mostrar a soma dos tamanhos de arquivo na listagem de diretórios

72

O dircomando de listagem de diretórios do Windows possui uma linha no final, mostrando a quantidade total de espaço ocupado pelos arquivos listados. Por exemplo, dir *.exemostra todos os .exearquivos no diretório atual, seus tamanhos e a soma total de seus tamanhos. Adoraria ter uma funcionalidade semelhante ao meu diralias no bash, mas não sei exatamente como fazê-lo.

Atualmente, eu 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 desta pergunta :

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

o que me dá o total, mas não imprime a lista de diretórios em si. Existe uma maneira de alterar isso em um script de uma linha ou shell, para que eu possa passar os lsargumentos que quiser dire obter uma lista completa mais a soma total? Por exemplo, eu gostaria de executar dir -R *.jpg *.tifpara obter a listagem e o tamanho total desses tipos de arquivo em todos os subdiretórios. Idealmente, seria ótimo se eu pudesse obter o tamanho de cada subdiretório, mas isso não é essencial.

MattDMo
fonte
5
Por que não ls -lhajuda você? Imprime a soma total no topo. Você também pode executar du -sh *.exepara obter informações sobre o uso do espaço em disco em formato legível por humanos.
precisa saber é o seguinte
@ashwin Eu não sei o que o 'total' ls -lhestá imprimindo, mas nem sempre está relacionado ao que os awkscripts abaixo calculam ou ao que eu adiciono manualmente. Às vezes, é próximo ao número de KB de arquivos no diretório, mas parece não ter efeito nos tamanhos alocados dos subdiretórios. Eu ficaria muito grato se você poderia me apontar para uma explicação sobre o que exatamente esse número é ...
MattDMo
ver se a minha resposta abaixo funciona para você
bagavadhar
11
ls -lhnão mostra o total de tamanho de um dir calcular o seu conteúdo
aequalsb

Respostas:

24

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

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

... mas não vai dar o que você está pedindo dir -R *.jpg *.tif, porque não é assim que ls -Rfunciona. Você pode querer brincar com o findutilitário para isso.


fonte
11
Isso é verdade, se você procura essencialmente o tamanho do conteúdo de cada arquivo, NÃO o tamanho que o arquivo consome no disco. Essa distinção é mais pronunciada para arquivos muito pequenos. Na minha distro, cada arquivo tem espaço alocado no disco em pedaços de 4 KB (portanto, um arquivo de 300 bytes ainda usa 4K em um disco, conforme relatado pelo comando du). Dado que o OP estava procurando "quanto espaço cada arquivo ocupa", então du é o caminho para fazê-lo.
Jon V
11
dirjá é o nome de um popular GNU coreutil, prefiro não nomear uma função como essa.
sobremesa
Corrija para que funcione no Linux e no OS-S e o seu "-a" inclui "." e "..", o que não é bom:) Aqui está o comando fixo: dir () {ls -FAl "$ {@}" | awk '{total + = $ 5; impressão }; END {print "total:" total} '; }
Dmitry Shevkoplyas
148

Já existe um comando UNIX para isso: du

Apenas faça:

du -ach 

Conforme 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 adequado para humanos, -afornece o tamanho "aparente" (tamanho do arquivo em vez do uso do disco) e -cfornece um total no final.

Pete Cornell
fonte
12
Sim, du funciona bem. Você pode usar a opção -c (igual a --total) para obter um total no final da lista.
MikeB 21/05
6
Observe que dufornece o uso do disco, não a soma dos tamanhos dos arquivos.
Stéphane Chazelas
7
du -hnão soma os tamanhos dos arquivos passados ​​para ele. du -h *.somostra o tamanho de cada arquivo, mas não a soma. Eu acho que o que você está querendo aqui é du -hc *.so(ou até du -hc *.so | tail -1). Mas é claro que ele também quer a lista de diretórios.
Expiação limitada
11
Este comando funciona apenas com uma lista curta de arquivos. Veja o que acontece quando você tem 850000 arquivos em um diretório !!!
Hamid FzM
3
! -ameios --all. Considere, em vez utilizando--apparent-size
Arnauld VM
17

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

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

mani deepak
fonte
15
du -hs directoryse você quer apenas o total.
Stéphane Chazelas
8

Simplesmente imprima a linha atual que você está somando o total de:

dir | awk '{ print; total += $4 }; END { print "total size: ",total }'
Mauritz Hansen
fonte
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.

ingopingo
fonte
1

Adicionar o seguinte a .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 o total no final. Você pode controlar a profundidade desejada, adicionando um parâmetro maxdepth à localização. Eu sei que executar encontrar duas vezes não é uma idéia muito eficaz. Mas eu não conseguia pensar em uma maneira melhor. Pelo menos, ele faz o trabalho.

Bagavadhar
fonte
1

Usar du e uma declaração awk como a mencionada acima fornecerá 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.

user3085123
fonte
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 substituir o processo ...

dir | tee >( awk '{ total += $4 }; END { print total }' )
Janis
fonte
Não há necessidade de tee, apenasdir | awk '{print; total += $4}; END {print total}'
Stéphane Chazelas
0
du path_to_your_files/*.jpg | awk '{ total += $1 }; END { print total }'
Tamer Mansour
fonte
3
Não. Primeiro, apenas dar um comando não é uma resposta. Segundo, se você se desse ao trabalho de ler a pergunta toda, as outras respostas e os meus comentários, veria que NÃO é isso que eu quero.
precisa saber é o seguinte
Para ser justo com o pôster, este é o primeiro resultado da pesquisa no Google linux sum human readable sizese é o que estou procurando.
Sridhar Sarnobat 18/08
-2
du * | awk -v sum=0 '{print sum+=$1}' | tail -1
Jason
fonte
Isso não faz o que eu estava pedindo.
precisa saber é o seguinte