Menyortir ukuran file yang dapat dibaca manusia

16

Bagaimana saya bisa mengurutkan daftar menggunakan semacam ukuran file yang dapat dibaca orang, jenis numerik yang memperhitungkan pengidentifikasi ukuran (G, M, K)? Bisakah saya mengurutkan du -shkeluaran " " sebagai contoh?

Masalah: Pertimbangkan masalah daftar file / folder dan urutkan berdasarkan ukurannya. Anda dapat mencapainya dengan menjalankan:

du -s * | sort -n

Ini mencantumkan file / folder yang diurutkan berdasarkan ukurannya. Namun nilai ukuran yang dicetak adalah dalam byte (atau megabita, atau gigabita jika Anda memilih).

Akan diinginkan untuk dapat mengurutkan berdasarkan nilai yang dapat dibaca manusia, jadi saya dapat menjalankan sesuatu yang analog

du -sh * | <human-readable file sort>

Dan memiliki folder 1,5GB muncul setelah 2,0 juta.

tidak ada
sumber

Jawaban:

29

Gunakan GNU coreutils> = 7.5:

du -hs * | semacam-h

(Diambil dari pertanyaan kesalahan server ini )

Halaman manual

Sunting: Anda dapat memeriksa versi Anda menggunakan du --versiondan sort --versionjika Anda menggunakan versi GNU. Jika Anda menggunakan homebrew, Anda mungkin perlu menggunakan gdudan gsort.

Jason Axelson
sumber
8
OSX tidak memiliki opsi ini. Anda dapat menggunakan homebrew untuk brew install coreutils(yang menambahkan semua perintah coreutils dengan a 'g'). Anda kemudian dapat melakukannya gdu -hs * | gsort -h.
dsummersl
1
Hanya untuk memperjelas poin @ dsummersl: du -hs *berfungsi dengan baik pada Mac OS X, tetapi sort -hkembali sort: invalid option -- h. Seseorang juga dapat menginstal paket coreutils melalui MacPorts seperti dijelaskan di sini .
jvriesem
3

Jika Anda hanya khawatir tentang file yang lebih besar dari 1MB, seperti Anda, Anda dapat menggunakan perintah ini untuk mengurutkannya dan menggunakan awk untuk mengonversi ukuran menjadi MB:

du -s * | sort -n | awk '{print int($1 / 1024)"M\t"$2}'

Sekali lagi, ini membulatkan ukuran ke MB terdekat. Anda dapat memodifikasinya menjadi unit pilihan Anda.

Patrick
sumber
Hal ini mirip dengan: du -sm * | sort -n. -s/ -gmembuat duukuran output dalam megabyte / gigabytes.
notnoop
Untuk MB Anda harus membagi dengan 1024 lebih. Jadi itu akan terjadiint($1 / (1024 * 1024))
Pratik Khadloya
2

Yang ini menangani nama file dengan spasi putih atau apostrof, dan bekerja pada sistem yang tidak mendukung xargs -datau sort -h:

du -s * | sort -n | cut -f2 | tr '\n' '\0' | xargs -0 -I {} du -sh "{}"

yang mengakibatkan:

368K    diskmanagementd
392K    racoon
468K    coreaudiod
472K    securityd
660K    sshd
3.6M    php-fpm
Mark Crossfield
sumber
1

Ini satu lagi:

$ du -B1 | sort -nr | perl -MNumber::Bytes::Human=format_bytes -F'\t' -lane 'print format_bytes($F[0])."\t".$F[1]'

Anda mungkin harus melakukan

$ cpan Number::Bytes::Human

pertama.

0x89
sumber
1

du -sk * | sort -n | awk '{print $ 2}' | saat membaca f; do du -sh "$ f"; selesai


sumber
1

Perintah ini akan mengurutkan berdasarkan ukuran dalam MB

du --block-size=MiB --max-depth=1 path | sort -n
lukmansh
sumber
Itulah yang sebenarnya dilakukan pengguna, dia hanya tidak memberi contoh dengan MiB tetapi menyebutkan tentang itu. Apa yang dia cari adalah bisa menyortir saat menggunakan -hflag ke du.
Tonin
0

Saya berakhir di sini karena saya mencoba untuk mengurutkan sesuatu yang menggabungkan MB dan GB dalam output yang sama dan saya tidak bisa mengendalikannya.

$NFdigunakan karena pola #GBatau #MBadalah kolom terakhir dalam output:

somecommand | \
gawk '{
  if ($NF ~ /[0-9\.]+GB/) 
    { a=gensub(/([0-9\.]+)(GB)/,"\\1","g",$NF); \
    printf "%sMB\n", a*1024} \
  else {print $NF} 
}' | \
sort -n

Penjelasan perintah awk:

if ($NF ~ /[0-9\.]+GB/)

jika kolom terakhir cocok dengan pola regex yang berisi angka atau .satu atau lebih kali diikuti olehGB

{ a=gensub(/([0-9\.]+)(GB)/,"\\1","g",$NF); \

kemudian atur variabel ake bagian digit dari setiap baris yang cocok dengan pola regex yang sama di kolom terakhir yang sama ( $NF)

printf "%sMB\n", a*1024} \

setelah pengaturan a, gunakan printfuntuk memformat output sebagai${a*1024}MB

else {print $NF}

kalau tidak, cetak saja kolom terakhir

sort -n

gunakan pengurutan angka pada output


contoh

echo "4MB\n5GB\n420MB\n420GB\n1024MB\n1GB" | \                                                                                                                                 23:43:06 (EMP-2653/package-upgrades) Ø M
gawk '{
  if ($NF ~ /[0-9\.]+GB/)
    { a=gensub(/([0-9\.]+)(GB)/,"\\1","g",$NF); \
    printf "%sMB\n", a*1024} \
  else {print $NF}
}' | \
sort -n

Saya yakin ada cara untuk menggunakan kembali pola regex jadi saya hanya melakukan pertandingan sekali dan mengganti di tempat, tapi saya belum tahu bagaimana melakukannya :)

Jens Bodal
sumber