Tampilkan jumlah ukuran file dalam daftar direktori

72

dirPerintah daftar direktori Windows memiliki garis di bagian akhir yang menunjukkan jumlah total ruang yang diambil oleh file yang terdaftar. Misalnya, dir *.exemenunjukkan semua .exefile di direktori saat ini, ukurannya, dan jumlah total ukurannya. Saya ingin memiliki fungsi yang mirip dengan diralias saya di bash, tapi saya tidak yakin bagaimana melakukannya.

Saat ini, saya miliki alias dir='ls -FaGl'di .bash_profilepertunjukan saya

drwxr-x---+  24 mattdmo  4096 Mar 14 16:35 ./
drwxr-x--x. 256 root    12288 Apr  8 21:29 ../
-rw-------    1 mattdmo 13795 Apr  4 17:52 .bash_history
-rw-r--r--    1 mattdmo    18 May 10  2012 .bash_logout
-rw-r--r--    1 mattdmo   395 Dec  9 17:33 .bash_profile
-rw-r--r--    1 mattdmo   176 May 10  2012 .bash_profile~
-rw-r--r--    1 mattdmo   411 Dec  9 17:33 .bashrc
-rw-r--r--    1 mattdmo   124 May 10  2012 .bashrc~
drwx------    2 mattdmo  4096 Mar 24 20:03 bin/
drwxrwxr-x    2 mattdmo  4096 Mar 11 16:29 download/

sebagai contoh. Mengambil jawaban dari pertanyaan ini :

dir | awk '{ total += $4 }; END { print total }'

yang memberi saya total, tetapi tidak mencetak daftar direktori itu sendiri. Apakah ada cara untuk mengubah ini menjadi skrip satu-liner atau shell sehingga saya bisa memberikan lsargumen yang saya inginkan dirdan mendapatkan daftar lengkap ditambah jumlah total? Sebagai contoh, saya ingin menjalankan dir -R *.jpg *.tifuntuk mendapatkan daftar dan ukuran total dari jenis file tersebut di semua subdirektori. Idealnya, akan lebih bagus jika saya bisa mendapatkan ukuran dari setiap subdirektori, tetapi ini tidak penting.

MattDMo
sumber
5
Kenapa tidak ls -lhmembantumu? Ini mencetak jumlah total di atas. Anda juga dapat menjalankan du -sh *.exeuntuk mendapatkan informasi penggunaan ruang disk dalam bentuk yang dapat dibaca manusia.
bagavadhar
@ashwin Saya tidak tahu apa 'total' ls -lhyang dicetak, tapi itu tidak selalu terkait dengan apa yang awkdihitung skrip di bawah ini, atau apa yang saya tambahkan dengan tangan. Kadang-kadang mendekati jumlah KB file dalam direktori, tetapi tampaknya tidak mengambil ukuran subdirektori yang berlaku. Saya akan berterima kasih jika Anda bisa mengarahkan saya ke penjelasan tentang apa sebenarnya angka itu ...
MattDMo
lihat apakah jawaban saya di bawah ini berfungsi untuk Anda
bagavadhar
1
ls -lhtidak menunjukkan total ukuran dir yang menghitung kontennya
aequalsb

Jawaban:

24

Fungsi berikut melakukan sebagian besar dari apa yang Anda minta:

dir () { ls -FaGl "${@}" | awk '{ total += $4; print }; END { print total }'; }

... tapi itu tidak akan memberi Anda apa yang Anda minta dir -R *.jpg *.tif, karena itu bukan cara ls -Rkerjanya. Anda mungkin ingin bermain-main dengan findutilitas untuk itu.


sumber
1
Ini benar, jika Anda pada dasarnya mencari ukuran isi setiap file, BUKAN ukuran yang dikonsumsi file pada disk. Perbedaan ini lebih jelas untuk file yang sangat kecil. Pada distro saya setiap file dialokasikan ruang pada disk dalam potongan 4 KB (jadi file 300 byte masih menggunakan 4K pada disk, seperti yang dilaporkan oleh perintah du). Mengingat itulah yang dicari OP "berapa banyak ruang yang digunakan setiap file", maka du adalah cara untuk melakukannya.
Jon V
1
dirsudah menjadi nama GNU coreutil yang populer, saya lebih suka tidak menyebutkan fungsi seperti itu.
hidangan penutup
Harap perbaiki agar berfungsi pada Linux dan OS-S dan "-a" termasuk "." dan "..", yang tidak baik:) Ini perintah tetap: dir () {ls -FAl "$ {@}" | awk '{total + = $ 5; cetak}; END {print "total:" total} '; }
Dmitry Shevkoplyas
148

Sudah ada perintah UNIX untuk ini: du

Kerjakan saja:

du -ach 

Sesuai konvensi, Anda dapat menambahkan satu atau lebih jalur file atau direktori di akhir perintah. -hadalah ekstensi untuk mengubah ukuran menjadi format ramah-manusia, -amemberi Anda ukuran "jelas" (ukuran file alih-alih penggunaan disk), dan -cmemberikan total pada akhirnya.

Pete Cornell
sumber
12
Ya, du berfungsi dengan baik. Anda dapat menggunakan opsi -c (sama dengan --total) untuk mendapatkan total di akhir daftar.
MikeB
6
Catatan yang dumemberikan penggunaan disk, bukan jumlah ukuran file.
Stéphane Chazelas
7
du -htidak menjumlahkan ukuran file yang diteruskan ke sana. du -h *.somenunjukkan ukuran setiap file, tetapi bukan jumlah. Saya pikir yang Anda inginkan di sini adalah du -hc *.so(atau bahkan du -hc *.so | tail -1). Tapi tentu saja, dia juga menginginkan daftar direktori.
Penebusan Terbatas
1
Perintah ini hanya berfungsi dengan daftar file pendek. Lihat apa yang terjadi ketika Anda memiliki 850000 file di direktori !!!
Hamid FzM
3
! -aberarti --all. Pertimbangkan untuk menggunakan--apparent-size
Arnauld VM
17

Anda dapat gunakan du -h -c directory|tail -1

Ini akan menghasilkan satu baris dengan penggunaan memori.

mani deepak
sumber
15
du -hs directoryjika Anda hanya menginginkan totalnya.
Stéphane Chazelas
8

Cukup cetak baris saat ini bahwa Anda menjumlahkan total:

dir | awk '{ print; total += $4 }; END { print "total size: ",total }'
Mauritz Hansen
sumber
6

dengan perl:

perl -le 'map { $sum += -s } @ARGV; print $sum' -- *.pdf

Ukuran semua file PDF yang tidak disembunyikan di direktori saat ini.

ingopingo
sumber
1

Menambahkan berikut ini ke .bash_profile atau .bashrc berfungsi untuk saya.

dir ()
{
find . -iname "$@" -exec ls -lh {} \;
find . -iname "$@" -print0|xargs -r0 du -csh|tail -n 1;
}

Sekarang ketika saya melakukan dir * .mp3 itu dilakukan secara rekursif dan mencetak total pada akhirnya. Anda dapat mengontrol berapa banyak kedalaman yang Anda inginkan dengan menambahkan parameter maxdepth ke find. Saya tahu menjalankan find dua kali bukan ide yang sangat efektif. Tetapi saya tidak bisa memikirkan cara yang lebih baik. Setidaknya itu menyelesaikan pekerjaan.

bagavadhar
sumber
1

Menggunakan du dan pernyataan awk seperti yang disebutkan di atas akan memberikan apa yang Anda cari.

Contoh: du /home/abc/Downloads/*.jpg | awk '{ print; total += $1 }; END { print "total size: ",total }'

Ini akan mencantumkan semua file dalam folder Unduhan pengguna abc yang berakhiran .jpg dan mencetak jumlah semua file ini di akhir daftar.

pengguna3085123
sumber
0

Untuk mendapatkan keduanya, dir output dan perhitungan ukuran, tanpa menggunakan opsi yang diusulkan lainnya, Anda dapat menggunakan tee (1) dan memproses substitusi ...

dir | tee >( awk '{ total += $4 }; END { print total }' )
Janis
sumber
Tidak perlu tee, hanyadir | awk '{print; total += $4}; END {print total}'
Stéphane Chazelas
0
du path_to_your_files/*.jpg | awk '{ total += $1 }; END { print total }'
Penjinak Mansour
sumber
3
Tidak. Pertama, hanya memberi perintah bukanlah jawaban. Kedua, jika Anda ingin membaca seluruh pertanyaan, jawaban yang lain, dan komentar saya, Anda pasti sudah melihat ini BUKAN yang saya inginkan.
MattDMo
Agar adil untuk poster, ini adalah hasil pencarian pertama untuk pencarian Google linux sum human readable sizesdan apa yang saya cari.
Sridhar Sarnobat
-2
du * | awk -v sum=0 '{print sum+=$1}' | tail -1
jason
sumber
Ini tidak melakukan apa yang saya minta.
MattDMo