Saya pada dasarnya mencari file kemudian mengurutkan berdasarkan ukuran. Script berfungsi jika saya tidak mengurutkan ukuran berdasarkan dapat dibaca manusia Tapi saya ingin ukurannya bisa dibaca manusia. Bagaimana saya bisa mengurutkan ukuran yang dapat dibaca manusia?
Sebagai contoh:
ls -l | sort -k 5 -n | awk '{print $9 " " $5}'
Ini berfungsi seperti yang diharapkan, saya mendapatkan ukuran file saya dalam byte naik:
1.txt 1
test.txt 3
bash.sh* 573
DocGeneration.txt 1131
andres_stuff.txt 1465
Branches.xlsx 15087
foo 23735
bar 60566
2016_stuff.pdf 996850
Sekarang, saya ingin ukurannya bisa dibaca manusia, jadi saya menambahkan parameter -h ke ls, dan sekarang beberapa file rusak:
ls -lh | sort -k 5 -n | awk '{print $9 " " $5}'
1.txt 1
DocGeneration.txt 1.2K
andres_stuff.txt 1.5K
test.txt 3
Branches.xlsx 15K
foo 24K
bar 60K
bash.sh* 573
2016_stuff.pdf 974K
-k 5
- bagaimana cara kerjanya?ls
outputdu
bukannyals
bisa menjadi ide yang bagus.find
's-printf
dengan nya%p
dan%s
formatters (diikuti dengan ‘humanisation’ dari ukuran).Jawaban:
Mencoba
sort -h k2
Itu adalah bagian dari jenis gnu, jenis BSD, dan lainnya.
sumber
ls
harus dihindari?ls
, dan alih-alih menggunakan globbing file secara langsung. Globbing saja tidak akan bekerja di sini. Yang mengatakan, saya mungkin lebih sukadu
untuk ini.files=(); for f in *; do [[ -L "$f" ]] && files+=("$f"); done; echo ${#files[@]}
(Saya mungkin memiliki saklar tes symlink salah). Jika Anda tidak peduli dengan symlinkfiles=(*); echo ${#files[@]}
,, yang menjadi portabel jika Anda menggunakanset
dan tidak array.ls
memiliki fungsi ini bawaan, gunakan-S
opsi dan urutkan dalam urutan terbalik:ls -lShr
sumber
-h
bukan opsi standarls
, tetapi harus dapat digunakan jika OP sudah memilikinya. Sisanya standar, dan itu pasti jawaban yang akan saya tulis.ls
.-S
mungkin tidak tersedia untuk Andals
. FWIW,-S
didukung bahkan dengan perpustakaan Emacsls-lisp.el
, yang digunakan ketika OS tidak memilikils
. Ini berfungsi di Emacs pada MS Windows, misalnya.-h
mungkin tidak tersedia secara universal, tetapi OP sudah menggunakannya.-S
benar - benar harus tersedia secara universal, karena itu ada di tautan POSIX yang disediakan Toby. Namun, beberapa toolkit non-POSIX memang ada di luar sana.Karena tidak ada shell spesifik yang disebutkan, inilah cara melakukan semuanya di
zsh
shell:The
**
pola glob cocok seperti*
tetapi di seluruh/
di path, yaitu seperti pencarian rekursif akan melakukan.The
ls
perintah akan memungkinkan ukuran yang dapat dibaca manusia dengan-h
, dan daftar panjang format output dengan-l
. The-f
menonaktifkan opsi pengurutan, sehinggals
hanya akan daftar file dalam urutan mereka diberikan.Urutan ini disusun oleh
**/*(.Lk-1024oL)
pola nama globbing sehingga file yang lebih kecil didaftar terlebih dahulu. The**/*
bit cocok dengan setiap file dan direktori dalam direktori dan di bawah ini, tetapi(...)
memodifikasi perilaku gumpal ini (itu adalah "kualifikasi segumpal").Itu
oL
pada akhirnya yang memerintahkan (o
) nama berdasarkan ukuran file (L
, "panjang").Di
.
awal membuat glob hanya cocok dengan file biasa (tidak ada direktori).The
Lk-1024
file bit menyeleksi yang ukurannya kurang dari 1024 KB ( "panjang di KB kurang dari 1024").Jika
zsh
bukan shell interaktif utama Anda, maka Anda dapat menggunakannyaGunakan
setopt GLOB_DOTS
(atauzsh -o GLOB_DOTS -c ...
) untuk juga cocok dengan nama yang disembunyikan. ... atau tambahkan sajaD
string kualifikasi glob.Memperluas di atas, dengan asumsi bahwa Anda ingin output 2-kolom dengan nama path dan ukuran yang dapat dibaca manusia, dan juga dengan asumsi bahwa Anda memiliki
numfmt
dari GNU coreutils,atau, lebih cepat,
sumber
Jika Anda
sort
tidak memiliki-h
opsi, Anda dapat menggunakan perintah awk (walaupun sangat panjang) seperti berikut:Ini akan mengurutkan output Anda dalam byte dan kemudian mengubahnya menjadi ukuran yang dapat dibaca manusia sesudahnya.
sumber
Apakah ini akan berhasil?
awk
Exp pertama akan mencari file yang kurang dari 1M dan yang kedua akan mengambil ukuran byte dari hasilnya dan mengubahnya menjadi KB dan mencetak 3 elemen pertama untuk memberikan ukuran yang dapat dibaca oleh manusia.sumber