Bagaimana cara saya mengurutkan berdasarkan ukuran yang dapat dibaca manusia secara numerik?

20

misalnya saya punya perintah yang menunjukkan berapa banyak ruang yang dibutuhkan folder

du folder | sort -n

itu bekerja dengan baik, namun saya ingin memiliki bentuk yang dapat dibaca manusia

du -h folder

namun jika saya melakukan itu maka saya tidak bisa mengurutkannya sebagai angka.

Cara bergabung du folderdan du -h foldermelihat output diurutkan sebagai du folder, tetapi dengan kolom pertama daridu -h folder

PS ini hanya sebuah contoh. teknik ini mungkin sangat berguna bagi saya (jika memungkinkan)

UAdapter
sumber

Jawaban:

11

Berikut ini adalah pendekatan yang lebih umum. Dapatkan output du folderdan du -h folderdalam dua file berbeda.

du folder > file1
du -h folder > file2

Bagian kuncinya adalah ini: menyatukan file1dan file2baris demi baris, dengan pembatas yang cocok.

paste -d '#' file1 file2 > file3

(dengan asumsi #tidak muncul dalam file1dan file2)

Sekarang semacam file3. Perhatikan bahwa ini akan mengurutkan berdasarkan file1konten dan memutuskan hubungan berdasarkan file2konten. Ekstrak hasil yang relevan menggunakan cut:

sort -n -k1,7 file3 | cut -d '#' -f 2

Lihat juga man sortopsi lain.


Anda juga dapat menyimpan ini sebagai alias, untuk digunakan kembali nanti. Untuk melakukannya, tambahkan berikut ini di bagian bawah ~/.bashrc:

sorted-du () {
    paste -d '#' <( du "$1" ) <( du -h "$1" ) | sort -n -k1,7 | cut -d '#' -f 2
}

Kemudian, buka sesi terminal baru dan jalankan alias baru Anda:

sorted-du /home
Prateek
sumber
Saya menambahkan bagian terakhir tentang cara membuat solusi Anda menjadi alias.
SirCharlo
1
Menggunakan file aktual dalam alias (dan kemudian memanggil mereka) adalah ide yang sangat sangat buruk ! Pikirkan apa yang akan terjadi jika saya benar-benar memiliki file yang bernama file3di direktori saya, itu akan ditimpa dan kemudian dihapus! @ SirCharlo Saya menghapus definisi alias dari jawaban ini dan menggantinya dengan sesuatu yang lebih aman.
jmiserez
Yah askubuntu.com/a/80248/22308 cukup lakukan ini dengansort -h
Nam G VU
36

Coba sesuatu seperti:

du -h folder | sort -h

Alternatif: -nuntuk pengurutan Numerik

Catatan: -hopsi pengurutan hanya ada di versi Ubuntu yang lebih baru.

Allu2
sumber
3
ada di versi 8.17, jadi saya kira ini adalah cara termudah
steabert
1
Terima kasih kepada steabert karena telah menunjukkan bahwa perintah sortir telah ditingkatkan dari sort --version = 8.17 Ini adalah jawaban terbaik untuk versi Ubuntu yang lebih baru.
Kat Amsterdam
Ini harus menjadi yang diterima karena itu membersihkan yang menyelesaikan OP dengansort -h
Nam G VU
4

Jawaban ini berlaku untuk 10.04.4LTS dan versi Ubuntu yang lebih rendah.

Sayangnya jawaban akurat yang membedakan KMG itu sulit dan kompleks:

Anda dapat alias seluruh perintah du dengan yang bisa dibaca manusia menggunakan ini

alias duf='du -sk * | sort -n | perl -ne '\''($s,$f)=split(m{\t});for (qw(K M G)) {if($s<1024) {printf("%.1f",$s);print "$_\t$f"; last};$s=$s/1024}'\'

yang saya temukan di sini

http://www.earthinfo.org/linux-disk-usage-sorted-by-size-and-human-readable/

hanya cd ke folder yang ingin Anda ketahui kemudian duf

Anda bisa menambahkan alias ini ke akhir /home/user/.profile Anda untuk membuat perintah duf semi-permenant

hasil:

user@hostname:~$ duf
0.0K  Documenten
0.0K  Muziek
0.0K  Openbaar
0.0K  Sjablonen
0.0K  Video's
4.0K  backup_db.sql.g
4.0K  examples.desktop
12.0K xml printer ticket
52.0K hardinfo_report.html
152.0K    librxtxSerial.so
2.7M  jpos
4.4M  nxclient_3.5.0-7_amd64.deb
6.4M  nxnode_3.5.0-4_amd64.deb
6.8M  Downloads
7.4M  nxserver_3.5.0-5_amd64.deb
12.4M NetBeansProjects
18.1M mysqlworkbench.deb
28.3M Afbeeldingen
45.8M ergens-20110928-18.sql.gz
60.5M 2012-06-02ergens_archive.tar.gz
65.5M 2012-08-26ergens_archive.tar.gz
65.6M 2012-08-28ergens_archive.tar.gz
65.6M 2012-08-29ergens_archive.tar.gz
65.7M 2012-08-30ergens_archive.tar.gz
113.0M    Bureaublad
306.2M    ergens-20110928-18.sql

Inilah sebabnya mengapa du -sch /var/* | sort -ntidak berfungsi melihat penyortiran MKKMMKKMMK

user@hostname:~$ du -sch /var/* |sort -n

0 /var/crash
0 /var/local
0 /var/lock
0 /var/opt
8,0M  /var/backups
12K   /var/games
16K   /var/tmp
17M   /var/log
68M   /var/cache
104K  /var/spool
144K  /var/run
351M  /var/lib
443M  totaal
704K  /var/mail
Kat Amsterdam
sumber
Saya telah melaporkan ini kepada pengembang gnu-core dengan permintaan fitur untuk meningkatkan fungsi du -h dengan fitur sortir. via [email protected]
Kat Amsterdam
+1, mirip satu liner:du folder | sort -n | cut -f 2 | while IFS= read -r -d '' path; do du -sh -- "$path"; done
steabert
Baru saja mencoba 1 liner Anda di sistem live. Dapatkan kesalahan Akses Ditolak dan tidak ada hasil. Apakah Anda mencoba perintah ini pada sistem Ubuntu terlebih dahulu? Saya mengubah folder ke / home / nama pengguna
Kat Amsterdam
oh, maaf, Anda harus membuang -d '', itu sisa dari menggunakannya pada output dari perintah file.
steabert
Ini sepertinya bekerja dengan baik pada sistem non-Linux yang tidak mendukung GNU sort.
Stefan Lasiewski
2

Command GNU sortmemiliki opsi berikut:

-h, --human-numeric-sort bandingkan angka yang dapat dibaca manusia (mis., 2K 1G).

Untuk memiliki opsi ini pada BSD / OSX, Anda dapat menginstal sortdari coreutils(via brew) dan menambahkan folder bin PATHke file rc Anda .

Jadi perintahnya akan terlihat seperti:

du -ah . | sort -rh | head -20
kenorb
sumber
0

Untuk versi terbaru Ubuntu, gunakan du -h directory | sort -h.

Saya menggunakan formulir ini setiap saat untuk mencari file yang tidak terkontrol.

belacqua
sumber
Duplikat dari jawab 17 Nov '11 jam 17:13 Allu2
Penatua Geek
0

Buka terminal Anda dengan Ctrl+ Alt+ tdan ketik:

  du -sk * | sort -rn 
rɑːdʒɑ
sumber
: Sekarang saya terbiasa mengubah Ctrl + Alt + t ke format di atas sehingga saya telah menempelkan format yang diperlukan ke Xpad saya. : D Rasanya luar biasa dipuji karena pekerjaan kasar seperti itu :)
jobin
Setiap pekerjaan yang Anda lakukan di sini layak mendapatkan pelengkap.
rɑːdʒɑ
0

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
Apa gunanya menggantikan \ndengan \0? Bukankah sudah agak terlambat untuk itu?
muru
ia menyiapkan input untuk xargs -0, yang mengharapkan input akan dibatasi NUL (seperti find -print0 akan menghasilkan). Kalau tidak, Anda tidak dapat menggunakan -0, dan apostrof memiliki arti khusus.
Mark Crossfield
Saya tahu -0, tetapi tidak relevan: imgur.com/87w3vfj
muru
Saya pikir itu bekerja karena Anda telah menggunakan backtick, bukan tanda kutip. gist.github.com/mrmanc/8aef830945ce03aa65f0
Mark Crossfield
0

Yang saya temukan bekerja pada semua sistem terlepas dari versi ( sort -htidak bekerja untuk saya) adalah

du -h $(du * | sort -n | awk '{print $2}')

pada awk '{print $2}'dasarnya mencetak nama file.

yahiaelgamal
sumber