Có ít nhất ba cách để lấy "tổng của tất cả dữ liệu trong tệp và thư mục con" theo byte hoạt động trong cả Linux / Unix và Git Bash dành cho Windows, được liệt kê bên dưới theo thứ tự trung bình từ nhanh nhất đến chậm nhất. Để bạn tham khảo, chúng được thực thi ở gốc của hệ thống tệp khá sâu ( docroot
trong bản cài đặt Magento 2 Enterprise bao gồm 71.158 tệp trong 30.027 thư mục).
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
Hai thứ này cũng hoạt động, nhưng chúng dựa trên các lệnh không tồn tại trên Git Bash dành cho 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
Nếu bạn chỉ muốn tổng số cho thư mục hiện tại, thì hãy thêm -maxdepth 1
vào find
.
Lưu ý rằng một số giải pháp được đề xuất không trả lại kết quả chính xác, vì vậy tôi sẽ gắn bó với các giải pháp ở trên.
$ 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
thực sự hiển thị số byte trong mỗi tệp chứ không phải dung lượng ổ đĩa. Điều này có đủ cho nhu cầu của bạn?