Bagaimana cara mendapatkan ukuran direktori aktual, menggunakan alat standar UNIX / Linux?
Pertanyaan alternatif: Bagaimana saya meminta du untuk menunjukkan ukuran direktori yang sebenarnya (bukan penggunaan disk)?
Karena orang tampaknya memiliki definisi yang berbeda dari istilah "ukuran": Definisi saya tentang "ukuran direktori" adalah jumlah semua file biasa dalam direktori itu.
Saya TIDAK peduli tentang ukuran inode direktori atau apa pun (blok * ukuran blok) file mengambil pada sistem file masing-masing. Direktori dengan 3 file, masing-masing 1 byte, memiliki ukuran direktori 3 byte (menurut definisi saya).
Menghitung ukuran direktori menggunakan du tampaknya tidak dapat diandalkan.
Misalnya, mkdir foo && du -b foo
melaporkan "4096 foo", 4096 byte, bukan 0 byte. Dengan direktori yang sangat besar, ukuran direktori dilaporkan olehdu -hs
dapat dimatikan sebesar 100 GB (!) Dan lainnya (sistem file terkompresi).
Jadi apa (alat / opsi) harus digunakan untuk mendapatkan ukuran direktori yang sebenarnya?
xfs
kebetulan?Jawaban:
Berikut ini adalah skrip yang menampilkan ukuran direktori yang dapat dibaca manusia menggunakan Unix standard tools (POSIX).
misalnya:
sumber
ls
doa di sini:-q
. Tanpa opsi ini skrip akan pecah jika beberapa nama file berisi karakter baris baru. Menulis skrip shell yang benar-benar andal terlalu sulit ...Beberapa versi
du
mendukung argumen--apparent-size
untuk menunjukkan ukuran yang tampak alih-alih penggunaan disk. Jadi perintah Anda adalah:Dari halaman manual untuk du disertakan dengan Ubuntu 12,04 LTS:
sumber
Hanya sebuah alternatif, menggunakan
ls
:ls -nR
:-n
seperti-l
, tetapi daftar UID angka dan GID dan-R
daftar subdirektori secara rekursif.grep -v:
Balikkan indra pencocokan, untuk memilih jalur yang tidak cocok. (-v ditentukan oleh POSIX.).'^ d'
akan mengecualikan direktori.Perintah Ls: http://linux.about.com/od/commands/l/blcmdl1_ls.htm
Man Grep: http://linux.die.net/man/1/grep
EDIT :
Diedit sebagai saran @ Sergey Vlasov.
sumber
-n
opsils
alih - alih-l
(menampilkan nomor UID / GID alih-alih nama) lebih aman, karena nama pengguna dan grup dapat berisi spasi (misalnya, jikawinbind
atausssd
digunakan untuk bergabung dengan sistem ke domain Windows, Anda bisa mendapatkan nama grup sepertidomain users
) . Itu juga harus lebih cepat karena tidak perlu mencari nama pengguna dan grup.Dengan asumsi Anda memiliki
du
dari GNU coreutils, perintah ini harus menghitung ukuran nyata total jumlah file acak di dalam direktori tanpa batasan arbitrer pada jumlah file:Tambahkan
-l
opsi kedu
jika ada beberapa file hardlink di dalamnya, dan Anda ingin menghitung setiap hardlink secara terpisah (secara defaultdu
menghitung beberapa hardlink hanya sekali).Perbedaan paling penting dengan plain
du -sb
adalah bahwa rekursifdu
juga menghitung ukuran direktori, yang dilaporkan secara berbeda oleh sistem file yang berbeda; untuk menghindari ini,find
perintah yang digunakan hanya meneruskan file biasadu
. Perbedaan lain adalah bahwa symlink diabaikan (jika harus dihitung, thefind
perintahnya harus disesuaikan).Perintah ini juga akan mengkonsumsi lebih banyak memori daripada sekadar plain
du -sb
, karena menggunakan--files0-from=FILE
makedu
store device dan nomor inode dari semua file yang diproses, berbeda dengan perilaku default yaitu hanya mengingat file dengan lebih dari satu hard link. (Ini bukan masalah jika-l
opsi digunakan untuk menghitung hardlink beberapa kali, karena satu-satunya alasan untuk menyimpan nomor perangkat dan inode adalah untuk melewati file-file hardlink yang sudah diproses.)Jika Anda ingin mendapatkan representasi ukuran total yang dapat dibaca manusia, cukup tambahkan
-h
opsi (ini berfungsi karenadu
dipanggil hanya sekali dan menghitung ukuran total itu sendiri, tidak seperti beberapa jawaban yang disarankan lainnya):atau (jika Anda khawatir bahwa beberapa efek
-b
kemudian ditimpa oleh-h
)sumber
-b
mungkin dapat digantikan oleh-A -B 1
, tidak ada yang setara dengan--files0-from=-
, dan menggunakanxargs
akan memerlukan beberapa solusi jika daftar file lebih besar dariARG_MAX
(dan beberapa solusi eksternal untuk output yang dapat dibaca manusia).Jika yang Anda inginkan adalah ukuran file, tidak termasuk ruang yang digunakan direktori, Anda dapat melakukan sesuatu seperti
@SergeyVlasov menunjukkan bahwa ini akan gagal jika Anda memiliki lebih banyak file daripada
argmax
. Untuk menghindari itu Anda bisa menggunakan sesuatu seperti:sumber
xargs
akan dipanggildu
beberapa kali, dan setiap doa akan mencetak total total hanya untuk bagiannya dari daftar file lengkap, makatail
hanya akan menunjukkan ukuran total dari bagian terakhir.