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 -sh
keluaran " " 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.
brew install coreutils
(yang menambahkan semua perintah coreutils dengan a 'g'). Anda kemudian dapat melakukannyagdu -hs * | gsort -h
.du -hs *
berfungsi dengan baik pada Mac OS X, tetapisort -h
kembalisort: invalid option -- h
. Seseorang juga dapat menginstal paket coreutils melalui MacPorts seperti dijelaskan di sini .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:
Sekali lagi, ini membulatkan ukuran ke MB terdekat. Anda dapat memodifikasinya menjadi unit pilihan Anda.
sumber
du -sm * | sort -n
.-s
/-g
membuatdu
ukuran output dalam megabyte / gigabytes.int($1 / (1024 * 1024))
Yang ini menangani nama file dengan spasi putih atau apostrof, dan bekerja pada sistem yang tidak mendukung
xargs -d
atausort -h
:yang mengakibatkan:
sumber
Ini satu lagi:
Anda mungkin harus melakukan
pertama.
sumber
du -sk * | sort -n | awk '{print $ 2}' | saat membaca f; do du -sh "$ f"; selesai
sumber
Perintah ini akan mengurutkan berdasarkan ukuran dalam MB
sumber
-h
flag ke du.Saya berakhir di sini karena saya mencoba untuk mengurutkan sesuatu yang menggabungkan MB dan GB dalam output yang sama dan saya tidak bisa mengendalikannya.
$NF
digunakan karena pola#GB
atau#MB
adalah kolom terakhir dalam output: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
a
ke 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
, gunakanprintf
untuk memformat output sebagai${a*1024}MB
else {print $NF}
kalau tidak, cetak saja kolom terakhir
sort -n
gunakan pengurutan angka pada output
contoh
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 :)
sumber