İnsan tarafından okunabilir boyut nasıl sıralanır


11

Temelde dosya boyutuna göre sıralama arıyorum. Boyutu insan tarafından okunabilir sıralamazsanız komut dosyası çalışır. Ama boyutun insan tarafından okunabilir olmasını istiyorum. İnsan tarafından okunabilir boyutları nasıl sıralayabilirim?

Örneğin:

 ls -l | sort -k 5 -n | awk '{print $9 " " $5}'

Bu beklendiği gibi çalışır, artan bayt cinsinden dosyalarımın boyutunu aldım:

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

Şimdi, boyutun okunabilir olmasını istiyorum, bu yüzden ls'ye bir -h parametresi ekledim ve şimdi bazı dosyalar bozuk:

 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- bu nasıl çalışıyor?
ctrl-alt-delor

@ ctrl-alt-delor: ls
Boyutun

2
duBunun yerine kullanmak lsiyi bir fikir olabilir.
xenoid

... ya find'ın -printfkendi diliyle %pve %s(boyutları ‘insaniletirilmesi’ izledi) biçemleyicilerle.
Stephen Kitt

@ Hatam hataya, ben sadece (bu ne var olarak işaretlenmiş) sorudaki veri sıralanmış girdi olduğunu varsayalım. Yanılmışım.
ctrl-alt-delor

Yanıtlar:


28

Deneyin sort -h k2

-h, - insan-sayısal-sıralanabilir insan tarafından okunabilir sayıları karşılaştırır (örneğin, 2K 1G)

GNU sort, BSD sort ve diğerlerinin bir parçasıdır.


5
Çıktıdan ayrıştırılmamalı lsmı?

3
@Tomasz Her zaman değil. İhtiyacınız olan çıktıyı sağlıyorsa, başka bir biçimlendirme işlemine bağlamak özellikle tehlikeli değildir. Yapmamanız gereken şey çıktı üzerinde döngü yapmak lsve bunun yerine doğrudan dosya globbing kullanmaktır. Tek başına globbing burada işe yaramaz. Bununla birlikte, muhtemelen bunu tercih edeceğim dedi du.
Bloodgain

1
@Kanat ls biçiminin sistemler / ls ikili dosyaları arasında aynı olduğu garanti edilmez, bu nedenle taşınabilir olarak ayrıştırılması imkansız kabul edilir.
D. Ben Knoble

1
Ayrıca,
boşluklu

1
@ Kanat: files=(); for f in *; do [[ -L "$f" ]] && files+=("$f"); done; echo ${#files[@]}(Ben bir symlink test anahtarı yanlış olabilir). Simgeleri umursamıyorsanız, dizileri değil, files=(*); echo ${#files[@]}kullanırsanız taşınabilir hale gelir set.
D. Ben Knoble

29

lsyerleşik bu işlevselliğe sahiptir, -Sseçeneği kullanın ve tersine sıralayın:ls -lShr

       -r, --reverse
              reverse order while sorting

       -S     sort by file size, largest first

1
-hstandart bir lsseçenek değildir , ancak OP'de zaten varsa kullanılabilir olmalıdır. Gerisi standarttır ve kesinlikle yazdığım cevaptır.
Toby Speight

5
+1 Çıktının ayrıştırılması etrafında karışıklık yok ls.
David Richerby

Bu en iyi yanıttır, ancak @ Toby'nin yorumunda bilgi içermelidir: -Ssizin için uygun olmayabilir ls. FWIW, işletim sistemi yokken kullanılan -SEmacs kütüphanesiyle bile desteklenir . Örneğin MS Windows'daki Emacs'da çalışır. ls-lisp.ells
Drew

Bu kabul edilen cevap olmalı.
Dağılım

1
@Drew: Toby'nin yorumu -hbunun evrensel olarak mevcut olmayabileceğini söylüyor , ancak OP zaten zaten kullanıyor. -Sgerçekten evrensel olarak erişilebilir olmalı , çünkü Toby'nin sağladığı POSIX bağlantısında. Ancak, orada çok sayıda POSIX olmayan araç kiti bulunmaktadır.
Kevin

5

Belirli bir kabuktan bahsedilmediğinden, kabuktaki her şeyi nasıl yapacağınız aşağıda açıklanmıştır zsh:

ls -lhf **/*(.Lk-1024oL)

**Gibi topak desen eşleşir *ancak karşısında /gibi yani pathnames bir özyinelemeli arama yapardı.

lsKomut ile insan okunabilir boyutları sağlayacak -hve uzun liste çıkış biçimi -l. -fOpsiyon devre dışı bırakır, böylece sıralama lssadece onlar verilmiştir sırayla dosyaları listelemek istiyorum.

Bu sipariş, **/*(.Lk-1024oL)daha küçük dosyaların önce listelenmesi için dosya adı globbing deseni tarafından düzenlenir . **/*Biraz bu dizinde ve aşağıda her dosya ve dizin ile eşleşir, ancak (...)değiştirir Glob davranışı (bir "topak eleme" var).

Bu var oLsonunda bu siparişleri ( odosya boyutuna göre) isimleri ( L"uzunluk").

.Başında Glob sadece normal dosyaları (hiçbir dizinleri) eşleşmesi yapar.

Lk-1024Olan boyutu az 1024 KB ( "KB olarak uzunluğu az 1024 den") 'dir bit seçer dosyaları.

Eğer zshbirincil interaktif kabuk değil, o zaman kullanabilirsiniz

zsh -c 'ls -lf **/*(.Lk-1024oL)'

Gizli adları da eşleştirmek için setopt GLOB_DOTS(veya zsh -o GLOB_DOTS -c ...) tuşunu kullanın . ... ya da sadece Dglob niteleyici dizesine ekleyin .


Yukarıdakilere genişleyerek, yol adları ve okunabilir boyutlara sahip 2 sütunlu bir çıktı istediğinizi varsayarsak ve ayrıca numfmtGNU coreutils'iniz olduğunu varsayarsak ,

zmodload -F zsh/stat b:zstat

for pathname in **/*(.Lk-1024oL); do
    printf '%s\t%s\n' "$pathname" "$(zstat +size "$pathname" | numfmt --to=iec)"
done

veya, daha hızlı,

paste <( printf '%s\n' **/*(.Lk-1024oL) ) \
      <( zstat -N +size **/*(.Lk-1024oL) | numfmt --to=iec )

4

Eğer senin sortyok -hseçeneği aşağıdakilerden gibi awk komutunun (çok uzun olsa) bir kullanabilirsiniz:

find . -type f -size -1024k -exec ls -al {} \; | sort -k 5 -n | awk '{if ($5 > 1099511627776) {print $9,$5/1024/1024/1024/1024"T"} else if ($5 > 1073741824) {print $9,$5/1024/1024/1024"G"} else if ($5 > 1048576) {print $9,$5/1024/1024"M"} else if ($5 > 1024) {print $9,$5/1024"K"} else {print $9,$5"B"}}' | column -t

Bu, çıktınızı bayt cinsinden sıralar ve daha sonra bunları okunabilir boyutlarına dönüştürür.


-1

Bu işe yarar mı?

ls -l | awk '{if ($5<=1024) {print}}' | sort -k 5 -n | awk '{print $9"\t"substr($5/1024,1,3)"k"} '| column -t

İlk awkexp 1M'den küçük dosyaları arayacak ve ikincisi bayt boyutunu sonuçtan alacak ve KB'ye dönüştürecek ve insan tarafından okunabilir bir boyut vermek için ilk 3 elemanı basacaktır.


Bu OPs sorusunu gerçekten çözmez - sadece geçerli dizine bakar ve sadece normal dosyaları yazdırır. Ayrıca 1MB yerine 1Kb ile karşılaştırılacaktır. Sonunda, kodun neden çalıştığına dair bazı açıklamalarla cevaplar peşindeyiz.
grochmal

Benim kötüm ne yaptığını ekledi.
Vignesh SP
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.