Ukuran total konten semua file dalam direktori [ditutup]

103

Saat saya menggunakan lsatau du, saya mendapatkan jumlah ruang disk yang ditempati setiap file.

Saya membutuhkan jumlah total semua data dalam file dan subdirektori yang akan saya dapatkan jika saya membuka setiap file dan menghitung byte. Poin bonus jika saya bisa mendapatkan ini tanpa membuka setiap file dan menghitung.

Arthur Ulfeldt
sumber
1
lssebenarnya menunjukkan jumlah byte di setiap file, bukan jumlah ruang disk. Apakah ini cukup untuk kebutuhan Anda?
Greg Hewgill
3
Perhatikan bahwa itu dutidak dapat digunakan untuk menjawab pertanyaan ini. Ini menunjukkan jumlah ruang disk yang ditempati direktori pada disk (data file ditambah ukuran meta-informasi sistem file tambahan). The duoutput dapat bahkan lebih kecil dari ukuran total semua file. Ini dapat terjadi jika sistem file dapat menyimpan data yang dikompresi pada disk atau jika tautan keras digunakan. Jawaban yang benar didasarkan pada lsdan find. Lihat jawaban oleh Nelson dan bytepan di sini, atau jawaban ini: unix.stackexchange.com/a/471061/152606
anton_rh

Jawaban:

108

Jika Anda menginginkan 'ukuran yang jelas' (yaitu jumlah byte di setiap file), bukan ukuran yang diambil oleh file di disk, gunakan opsi -batau --bytes(jika Anda memiliki sistem Linux dengan GNU coreutils ):

% du -sbh <directory>
Arkady
sumber
1
berfungsi pada kotak topi merah saya yang lebih baru, sayangnya tidak pada kotak Dev saya yang tersemat.
Arthur Ulfeldt
3
Adakah cara mudah untuk menunjukkan "ukuran yang tampak" dalam format yang dapat dibaca manusia? Saat menggunakan du -shb(seperti yang disarankan oleh jawaban ini), -bpengaturan tampaknya mengesampingkan -hpengaturan.
Mathias Bynens
6
@MathiasBynens Membalik urutan bendera (yaitu du -sbh <dir>). Bekerja untuk saya.
Luis E.
2
@MathiasBynensdu -sh --apparent-size /dir/
Jongosi
2
@Arkady Saya telah mencoba solusi Anda di CentOS dan Ubuntu, dan ada kesalahan kecil. Anda ingin "du -sbh". Bendera "-h" harus berada di urutan terakhir.
theJollySin
46

Penggunaan du -sb:

du -sb DIR

Secara opsional, tambahkan hopsi untuk hasil yang lebih ramah pengguna:

du -sbh DIR
rampok
sumber
4
-b tampaknya menjadi opsi ilegal untuk MacOS 'du
lynxoid
3
@lynxoid: Anda dapat menginstal versi GNU dengan minuman: brew install coreutils. Ini akan tersedia sebagai perintah gdu.
neu242
1
Tidak bekerja. ls-> file.gz hardlink-to-file.gz. stat -c %s file.gz-> 9657212. stat -c %s hardlink-to-file.gz-> 9657212. du -sb-> 9661308. Ini jelas bukan ukuran total konten tetapi ukuran direktori pada disk.
anton_rh
24

cd ke direktori, lalu:

du -sh

ftw!

Awalnya menulis tentang itu di sini: https://ao.gl/get-the-total-size-of-all-the-files-in-a-directory/

AO_
sumber
1
Ini sederhana dan berhasil! Terima kasih. Terkadang, saya suka menambahkan -Lopsi duberikut symlinks.
conradkleinespel
2
bekerja untuk saya (di OS X)
sam boosalis
2
Ini sederhana dan tidak berhasil. Ini mencetak ruang yang digunakan direktori pada disk, bukan ukuran total konten yang dapat dihitung dengan membuka setiap file dan menghitung byte.
anton_rh
17

Hanya alternatif:

ls -lAR | grep -v '^d' | awk '{total += $5} END {print "Total:", total}'

grep -v '^d' akan mengecualikan direktori.

Barun
sumber
4
Sempurna, juga tambahkan -a param untuk mendapatkan "file tersembunyi" (apa pun yang dimulai dengan titik)
Nicholi
Diisolasi ke jenis file tertentu (dalam hal ini, PNG) dan dinyatakan dalam MB agar lebih mudah dibaca: ls -lR | grep '.png$' | awk '{total += $5} END {print "Total:", total/1024/1024, "MB"}'
MusikPolice
Itu jawaban yang benar. Tidak seperti dusolusi ini, benar-benar menghitung ukuran total semua data dalam file seolah-olah dibuka satu per satu dan byte mereka dihitung. Tapi ya, menambahkan -Aparameter diperlukan untuk menghitung file tersembunyi juga.
anton_rh
13

Format "% s" stat memberi Anda jumlah byte sebenarnya dalam sebuah file.

 find . -type f |
 xargs stat --format=%s |
 awk '{s+=$1} END {print s}'

Jangan ragu untuk mengganti metode favorit Anda untuk menjumlahkan angka .

Nelson
sumber
4
Lebih disukai menggunakan "find. -Type f -print0 | xargs -0 ..." untuk menghindari masalah dengan nama file tertentu (mengandung spasi, dll).
hlovdal
1
ya, poin yang bagus. jika tidak ada di bsd 4.2 Saya tidak ingat untuk menggunakannya :-(
Nelson
3
find -print0dan xargs -0dibutuhkan untuk nama file dengan spasi. OS X inginkan stat -f %z.
Kornel
1
(Perhatikan bahwa stat berfungsi dengan file jarang, melaporkan ukuran nominal file yang besar dan bukan blok yang lebih kecil yang digunakan pada disk seperti dulaporan.)
Nelson
1
Tidak seperti banyak jawaban lain di sini yang secara keliru menggunakan duutilitas, jawaban ini benar. Ini sangat mirip dengan jawaban di sini: unix.stackexchange.com/a/471061/152606 . Tetapi saya akan menggunakan ! -type ddaripada -type fmenghitung symlink juga (ukuran symlink itu sendiri (biasanya beberapa byte), bukan ukuran file yang ditunjuknya).
anton_rh
3

Jika Anda menggunakan "du" busybox di sistem tertanam, Anda tidak bisa mendapatkan byte yang tepat dengan du, hanya Kbytes yang bisa Anda dapatkan.

BusyBox v1.4.1 (2007-11-30 20:37:49 EST) multi-call binary

Usage: du [-aHLdclsxhmk] [FILE]...

Summarize disk space used for each FILE and/or directory.
Disk space is printed in units of 1024 bytes.

Options:
        -a      Show sizes of files in addition to directories
        -H      Follow symbolic links that are FILE command line args
        -L      Follow all symbolic links encountered
        -d N    Limit output to directories (and files with -a) of depth < N
        -c      Output a grand total
        -l      Count sizes many times if hard linked
        -s      Display only a total for each argument
        -x      Skip directories on different filesystems
        -h      Print sizes in human readable format (e.g., 1K 243M 2G )
        -m      Print sizes in megabytes
        -k      Print sizes in kilobytes(default)
Sam Liao
sumber
3

Saat folder dibuat, banyak sistem file Linux mengalokasikan 4096 byte untuk menyimpan beberapa metadata tentang direktori itu sendiri. Ruang ini bertambah dengan kelipatan 4096 byte seiring pertumbuhan direktori.

du perintah (dengan atau tanpa opsi -b) hitung ruang ini , seperti yang Anda lihat mengetik:

mkdir test && du -b test

Anda akan mendapatkan hasil 4096 byte untuk dir kosong. Jadi, jika Anda meletakkan 2 file berukuran 10.000 byte di dalam dir, jumlah total yang diberikan oleh du -sb akan menjadi 24096 byte.

Jika Anda membaca dengan cermat pertanyaannya, bukan ini yang ditanyakan. Penanya bertanya:

jumlah total semua data dalam file dan subdirektori yang akan saya dapatkan jika saya membuka setiap file dan menghitung byte

bahwa dalam contoh di atas harus 20000 byte, bukan 24096.

Jadi, jawaban yang benar IMHO bisa jadi merupakan perpaduan jawaban Nelson dan saran hlovdal untuk menangani nama file yang mengandung spasi:

find . -type f -print0 | xargs -0 stat --format=%s | awk '{s+=$1} END {print s}'
bytepan
sumber
2

Setidaknya ada tiga cara untuk mendapatkan "jumlah total semua data dalam file dan subdirektori" dalam byte yang bekerja di Linux / Unix dan Git Bash untuk Windows, yang tercantum di bawah ini dalam urutan dari rata-rata tercepat hingga paling lambat. Untuk referensi Anda, mereka dijalankan di root sistem file yang cukup dalam ( docrootdalam instalasi Magento 2 Enterprise yang terdiri dari 71.158 file dalam 30.027 direktori).

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


Keduanya juga berfungsi, tetapi mengandalkan perintah yang tidak ada di Git Bash untuk 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


Jika Anda hanya menginginkan total untuk direktori saat ini, tambahkan -maxdepth 1ke find.


Perhatikan bahwa beberapa solusi yang disarankan tidak memberikan hasil yang akurat, jadi saya akan tetap menggunakan solusi di atas.

$ 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
thdoan
sumber
1
Mengenai Git Bash untuk Windows, - dalam kasus Cygwin, dcadalah bagian dari bcpaket, jadi untuk mendapatkannyadc perlu menginstal bc.
ruvim
1

Untuk Win32 DOS, Anda dapat:

c:> dir / sc: \ direktori \ Anda \ inginkan

dan baris kedua dari belakang akan memberi tahu Anda berapa byte yang dibutuhkan file.

Saya tahu ini membaca semua file dan direktori, tetapi bekerja lebih cepat dalam beberapa situasi.

Matahari
sumber
1

duberguna, tetapi findberguna jika Anda ingin menghitung ukuran beberapa file saja (misalnya, menggunakan filter menurut ekstensi). Perhatikan juga bahwa findmereka sendiri dapat mencetak ukuran setiap file dalam byte. Untuk menghitung ukuran total kita dapat menghubungkan dcperintah dengan cara berikut:

find . -type f -printf "%s + " | dc -e0 -f- -ep

Berikut findmenghasilkan urutan perintah dcseperti 123 + 456 + 11 +. Meskipun, program yang diselesaikan harus seperti 0 123 + 456 + 11 + p(ingat notasi postfix).

Jadi, untuk mendapatkan program yang selesai kita perlu meletakkan 0di stack sebelum menjalankan urutan dari stdin, dan mencetak nomor teratas setelah mengeksekusi ( pperintah di akhir). Kami mencapainya melalui dcopsi:

  1. -e0hanyalah jalan pintas untuk -e '0'meletakkan 0di tumpukan,
  2. -f-adalah untuk membaca dan menjalankan perintah dari stdin (yang dihasilkan di findsini),
  3. -epuntuk mencetak hasil ( -e 'p').

Untuk mencetak ukuran dalam MiB seperti yang 284.06 MiBdapat kita gunakan -e '2 k 1024 / 1024 / n [ MiB] p'di poin 3 (sebagian besar spasi opsional).

ruvim
sumber
1

Ini dapat membantu:

ls -l| grep -v '^d'| awk '{total = total + $5} END {print "Total" , total}'

Perintah di atas akan menjumlahkan semua file yang meninggalkan ukuran direktori.

Ataul Haque
sumber
1
Perhatikan bahwa solusi ini sangat mirip dengan jawaban Barun. Tetapi solusi ini tidak menjumlahkan file di sub-direktori.
ruvim
1
@ruvim, itu tidak menjumlahkan file tersembunyi juga. Untuk menjumlahkan file tersembunyi, -Aopsi harus ditambahkan ke ls.
anton_rh
0

Menggunakan:

$ du -ckx <DIR> | grep total | awk '{print $1}'

Di mana <DIR> adalah direktori yang ingin Anda periksa.

'-C' memberi Anda data total keseluruhan yang diekstraksi menggunakan bagian 'grep total' dari perintah, dan jumlah Kbytes diekstraksi dengan perintah awk.

Satu-satunya peringatan di sini adalah jika Anda memiliki subdirektori yang berisi teks "total", ini akan dimuntahkan juga.

Rob Jones
sumber