Mostra la somma delle dimensioni dei file nell'elenco delle directory


72

Il dircomando di elenco delle directory di Windows ha una riga alla fine che mostra la quantità totale di spazio occupato dai file elencati. Ad esempio, dir *.exemostra tutti i .exefile nella directory corrente, le loro dimensioni e la somma totale delle loro dimensioni. Mi piacerebbe avere funzionalità simili con il mio diralias in bash, ma non sono sicuro di come procedere.

Attualmente, ho alias dir='ls -FaGl'nel mio .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/

per esempio. Prendendo le risposte da questa domanda :

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

che mi dà il totale, ma non stampa l'elenco di directory stesso. C'è un modo per modificarlo in uno script di una riga o shell in modo che io possa passare tutti gli lsargomenti che voglio dire ottenere un elenco completo più la somma totale? Ad esempio, vorrei eseguire dir -R *.jpg *.tifper ottenere l'elenco e la dimensione totale di quei tipi di file in tutte le sottodirectory. Idealmente, sarebbe fantastico se potessi ottenere la dimensione di ogni sottodirectory, ma questo non è essenziale.


5
Perché non ls -lhti aiuta? Stampa la somma totale in alto. È inoltre possibile eseguire du -sh *.exeper ottenere informazioni sull'utilizzo dello spazio su disco in forma leggibile.
Bagavadhar,

@ashwin Non so cosa ls -lhstia stampando il 'totale' , ma non è sempre correlato a ciò che awkcalcolano gli script sottostanti o a ciò che aggiungo a mano. A volte è vicino al numero di KB di file nella directory, ma non sembra avere effetto sulle dimensioni allocate delle sottodirectory. Le sarei grato se potessi indicarmi una spiegazione di cosa sia esattamente quel numero ...
MattDMo

vedi se la mia risposta qui sotto funziona per te
bagavadhar

1
ls -lhnon mostra il totale delle dimensioni di una
directory

Risposte:


24

La seguente funzione fa la maggior parte di ciò che stai chiedendo:

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

... ma non ti darà quello che stai chiedendo dir -R *.jpg *.tif, perché non è così che ls -Rfunziona. Potresti voler giocare con l' findutilità per questo.


1
Questo è vero, se stai cercando essenzialmente la dimensione del contenuto di ciascun file, NON la dimensione che il file consuma sul disco. Questa distinzione è più pronunciata per file molto piccoli. Sulla mia distribuzione ogni file è allocato spazio su disco in blocchi da 4 KB (quindi un file da 300 byte utilizza ancora 4K su un disco, come riportato dal comando du). Dato che questo è ciò che l'OP stava cercando "quanto spazio occupa ogni file", allora du è il modo di farlo.
Jon V,

1
dirè già il nome di un popolare coreutil GNU, preferirei non nominare una funzione del genere.
dessert,

Correggi in modo che funzioni sia su Linux che su OS-S e che "-a" includa "." e "..", il che non va bene:) Ecco il comando fisso: dir () {ls -FAl "$ {@}" | awk '{total + = $ 5; Stampa }; END {print "total:" total} '; }
Dmitry Shevkoplyas l'

148

Esiste già un comando UNIX per questo: du

Basta fare:

du -ach 

Come da convenzione, è possibile aggiungere uno o più percorsi di file o directory alla fine del comando. -hè un'estensione per convertire le dimensioni in un formato a misura d'uomo, -ati dà la dimensione "apparente" (dimensione del file invece dell'uso del disco) e -cfornisce un totale alla fine.


12
Sì, du funziona bene. È possibile utilizzare l'opzione -c (uguale a --total) per ottenere un totale alla fine dell'elenco.
MikeB,

6
Si noti che dufornisce l'utilizzo del disco, non la somma delle dimensioni del file.
Stéphane Chazelas,

7
du -hnon somma le dimensioni dei file passati ad esso. du -h *.somostra la dimensione di ciascun file, ma non la somma. Penso che quello che vuoi qui sia du -hc *.so(o addirittura du -hc *.so | tail -1). Ma ovviamente vuole anche l'elenco delle directory.
Espiazione limitata il

1
Questo comando funziona solo con un breve elenco di file. Guarda cosa succede quando hai 850000 file in una directory !!!
Hamid FzM,

3
! -asignifica --all. Considera piuttosto l'utilizzo di--apparent-size
Arnauld VM


8

Stampa semplicemente la riga corrente di cui stai sommando il totale:

dir | awk '{ print; total += $4 }; END { print "total size: ",total }'

6

con perl:

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

Dimensione di tutti i file PDF non nascosti nella directory corrente.


1

Aggiungendo quanto segue a .bash_profile o .bashrc funziona per me.

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

Ora quando faccio un dir * .mp3 lo fa ricorsivamente e stampa il totale alla fine. Puoi controllare quanta profondità vuoi aggiungendo un parametro maxdepth alla ricerca. So che correre due volte non è un'idea molto efficace. Ma non riuscivo a pensare a un modo migliore. Almeno fa il lavoro.


1

Usando du e una dichiarazione awk come quella sopra menzionata fornirai quello che stai cercando.

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

Questo elencherà tutti i file nella cartella Download dell'utente abc che termina in .jpg e stampa la somma di tutti questi file alla fine dell'elenco.


0

Per ottenere sia l'output di dir che il calcolo delle dimensioni, senza utilizzare nessuna delle altre opzioni proposte, è possibile utilizzare tee (1) ed elaborare la sostituzione ...

dir | tee >( awk '{ total += $4 }; END { print total }' )

Non è necessario tee, solodir | awk '{print; total += $4}; END {print total}'
Stéphane Chazelas,

0
du path_to_your_files/*.jpg | awk '{ total += $1 }; END { print total }'

3
No. Innanzitutto, dare un comando non è una risposta. In secondo luogo, se ti fossi preso la briga di leggere l'intera domanda, le altre risposte e i miei commenti, avresti visto che NON è quello che voglio.
MattDMo,

Per essere onesti con il poster, questo è il primo risultato di ricerca per la ricerca di Google linux sum human readable sizesed è quello che sto cercando.
Sridhar Sarnobat, il

-2
du * | awk -v sum=0 '{print sum+=$1}' | tail -1

Questo non fa quello che stavo chiedendo.
MattDMo
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.