Asumsikan ada direktori penyimpanan gambar, katakanlah,, ./photos/john_doe
di dalamnya terdapat beberapa subdirektori, tempat banyak file tertentu berada (misalnya, *.jpg
). Bagaimana saya bisa menghitung ukuran ringkasan file-file di bawah john_doe
cabang?
Saya sudah mencoba du -hs ./photos/john_doe/*/*.jpg
, tetapi ini hanya menampilkan file individual. Juga, ini hanya melacak tingkat sarang pertama dari john_doe
direktori, seperti john_doe/june/
, tetapi melompat john_doe/june/outrageous/
.
Jadi, bagaimana saya bisa melintasi seluruh cabang, merangkum ukuran file tertentu?
files
directory
directory-structure
size
mbaitoff
sumber
sumber
LC_ALL=POSIX
sebagai awalan untuk selalu grep total seperti ini:LC_ALL=POSIX find ./photos/john_doe -type f -name '*.jpg' -exec du -ch {} + | grep total$
-name
, maka ubah grep kegrep -P "\ttotal$"
atau yang lain itu akan menangkap semua file yang diakhiri dengan "total" juga.bc
, jadi di sini adalah solusi yang lebih portabel:find -name '*.jpg' -type f -exec du -bc {} + | grep total$ | cut -f1 | awk '{ total += $1 }; END { print total }'
memberi saya total penggunaan
.jpg
file saya di direktori ini.Untuk berurusan dengan banyak direktori, Anda mungkin harus menggabungkan ini dengan
find
entah bagaimana.Anda mungkin menemukan contoh perintah du berguna (juga termasuk
find
)sumber
-R
opsi di man7.org/linux/man-pages/man1/du.1.html . Dan saya tidak berpikir opsi rekursif akan membantu dalam kasus ini karena shell melakukan ekspansi glob sebelum meneruskan argumendu
.Terutama, Anda membutuhkan dua hal:
-c
pilihan untukdu
, untuk menceritakannya untuk menghasilkan grand total;**
( instruksi aktivasi ) ataufind
( contoh ) atau untuk melintasi subdirektori.sumber
find
dapat mengembalikan hasil yang salah.du -ch -- ./{dir1,dir2}/*.jpg
ataudu -ch -- ./{prefix1*,prefix2*}.jpg
Argument list too long
kesalahan saat memproses sekitar 300 ribu file teks.getconf ARG_MAX
. Jika Anda memiliki lebih banyak, Anda perlu memproses file satu per satu atau secara bersamaan dengan for for.Jawaban akhirnya adalah:
dan bahkan versi yang lebih cepat, tidak dibatasi oleh RAM, tetapi itu membutuhkan GNU AWK dengan dukungan bignum:
Versi ini memiliki beberapa fitur berikut:
find
untuk menentukan file yang Anda carifind
apakah pencocokan wildcard sederhana dari nama file5.5K
,176.7M
, ...)| numfmt --to=si
sumber
Jawaban yang diberikan sampai sekarang tidak memperhitungkan bahwa daftar file yang diteruskan dari find ke du mungkin begitu lama sehingga menemukan secara otomatis membagi daftar menjadi potongan-potongan, yang mengakibatkan beberapa kejadian
total
.Anda dapat
grep total
(lokal!) Dan meringkas secara manual, atau menggunakan perintah yang berbeda. AFAIK hanya ada dua cara untuk mendapatkan jumlah total (dalam kilobyte) dari semua file yang ditemukan oleh find:find . -type f -iname '*.jpg' -print0 | xargs -r0 du -a| awk '{sum+=$1} END {print sum}'
Penjelasan
find . -type f -iname '*.jpg' -print0
: Temukan semua file dengan ekstensi jpg terlepas dari huruf besar-kecil (mis. * .Jpg, * .JPG, * .Jpg ...) dan hasilkan (diakhiri dengan nol).xargs -r0 du -a
: -r: Xargs akan memanggil perintah bahkan tanpa argumen yang dilewati, yang -r mencegah. -0 berarti string yang diakhiri dengan nol (bukan diakhiri baris baru).awk '{sum+=$1} END {print sum}'
: Jumlahkan ukuran file output dengan perintah sebelumnyaDan untuk referensi, sebaliknya
find . -type f -iname '*.jpg' -print0 | du -c --files0-from=-
sumber
du --file0-from
butuh waktu lebih lama karena Anda menjalankannya lebih dulu (efek caching).xargs
, beberapadu -a
mungkin dijalankan, sehingga Anda mungkin memiliki perbedaan jika ada tautan keras.Jika daftar file terlalu besar sehingga tidak dapat diteruskan ke satu permohonan tunggal
du -c
, pada sistem GNU, Anda dapat melakukan:(ukuran dinyatakan dalam jumlah blok 512 byte). Seperti
du
itu mencoba menghitung tautan keras hanya sekali. Jika Anda tidak peduli dengan hardlink, Anda dapat menyederhanakannya menjadi:Jika Anda menginginkan ukuran alih-alih penggunaan disk, ganti
%b
dengan%s
. Ukurannya kemudian akan dinyatakan dalam byte.sumber
-bash: bc: command not found
Centos - Linux 2.6.32-431.el6.x86_64bc
adalah perintah POSIX non-opsional.Solusi yang disebutkan sejauh ini tidak efisien (exec mahal) dan memerlukan kerja manual tambahan untuk menjumlahkan jika daftar file panjang atau mereka tidak bekerja pada Mac OS X. Solusi berikut ini sangat cepat, harus bekerja pada sistem apa pun, dan menghasilkan jawaban total dalam GB (hapus a / 1024 jika Anda ingin melihat total dalam MB):
find . -iname "*.jpg" -ls |perl -lane '$t += $F[6]; print $t/1024/1024/1024 . " GB"'
sumber
-iname
atau-ls
standar / portable, sehingga tidak akan bekerja pada sistem apapun baik. Ini juga tidak akan berfungsi dengan baik jika ada nama file atau target symlink yang berisi karakter baris baru.Meningkatkan jawaban hebat SHW untuk membuatnya berfungsi dengan lokal apa pun, seperti yang sudah ditunjukkan Zbyszek dalam komentarnya:
sumber
du secara alami melintasi hierarki direktori dan awk dapat melakukan penyaringan sehingga sesuatu seperti ini mungkin cukup:
Ini berfungsi tanpa GNU.
sumber
stat
panggilan untuk file yang tidak sesuai dengan pola yang dicari.