Ci sono almeno tre modi per ottenere la "somma totale di tutti i dati in file e sottodirectory" in byte che funzionano sia in Linux / Unix che in Git Bash per Windows, elencati di seguito in ordine dal più veloce al più lento in media. Per tuo riferimento, sono stati eseguiti alla radice di un file system abbastanza profondo ( docroot
in un'installazione di Magento 2 Enterprise comprendente 71.158 file in 30.027 directory).
1.
$ time find -type f -printf '%s\n' | awk '{ total += $1 }; END { print total" bytes" }'
748660546 bytes
real 0m0.221s
user 0m0.068s
sys 0m0.160s
2.
$ time echo `find -type f -print0 | xargs -0 stat --format=%s | awk '{total+=$1} END {print total}'` bytes
748660546 bytes
real 0m0.256s
user 0m0.164s
sys 0m0.196s
3.
$ time echo `find -type f -exec du -bc {} + | grep -P "\ttotal$" | cut -f1 | awk '{ total += $1 }; END { print total }'` bytes
748660546 bytes
real 0m0.553s
user 0m0.308s
sys 0m0.416s
Anche questi due funzionano, ma si basano su comandi che non esistono su Git Bash per Windows:
1.
$ time echo `find -type f -printf "%s + " | dc -e0 -f- -ep` bytes
748660546 bytes
real 0m0.233s
user 0m0.116s
sys 0m0.176s
2.
$ time echo `find -type f -printf '%s\n' | paste -sd+ | bc` bytes
748660546 bytes
real 0m0.242s
user 0m0.104s
sys 0m0.152s
Se desideri solo il totale per la directory corrente, aggiungi -maxdepth 1
a find
.
Nota che alcune delle soluzioni suggerite non restituiscono risultati accurati, quindi preferirei le soluzioni sopra.
$ du -sbh
832M .
$ ls -lR | grep -v '^d' | awk '{total += $5} END {print "Total:", total}'
Total: 583772525
$ find . -type f | xargs stat --format=%s | awk '{s+=$1} END {print s}'
xargs: unmatched single quote; by default quotes are special to xargs unless you use the -0 option
4390471
$ ls -l| grep -v '^d'| awk '{total = total + $5} END {print "Total" , total}'
Total 968133
ls
mostra effettivamente il numero di byte in ogni file, non la quantità di spazio su disco. È sufficiente per le tue esigenze?