Boyuta göre sipariş edilen tüm dosyalar nasıl listelenir


241

Tüm dosyaları büyükten küçüğe doğru sıralamak istiyorum ve dosyalar belirli bir klasörde herhangi bir yerde bulunabilir.



5
from man ls:-S sort by file size
ctrl-alt-delor

“Dosyalar bu dizinde” veya “dosyalar herhangi bir alt dizinde olabilir” anlamına mı geliyor?
ctrl-alt-delor

Bir GUI aracı kullanmak istiyorsanız / kullanabiliyorsanız , daha önce KDirStat olan QDirStat'a bir göz atın .
RhinoDevel

Yanıtlar:


290

Basitçe şöyle bir şey kullanın:

ls -lS /path/to/folder/

Sermaye S .

Bu, dosyaları boyuta göre sıralayacaktır.

Ayrıca bakınız:

man ls

-S     sort by file size

Tersine sıralamak istiyorsanız , sadece -ranahtar ekleyin .

Güncelleme:

Dizinleri hariç tutmak için (ve dosya adlarından hiçbirine veya sembolik bağlantı hedeflerinden hiçbirine yeni satır karakterleri içermemesi koşuluyla):

ls -lS | grep -v '^d' 

Güncelleme 2:

Şimdi hala klasörler olabilen sembolik bağları nasıl gösterdiğini görüyorum. Sembolik linkler, linkte olduğu gibi daima l harfi ile başlar.

A filtrelemek için komutu değiştirin -. Bu sadece düzenli dosyalar bırakmalıdır:

ls -lS | grep '^-'

Benim sistemimde bu sadece normal dosyaları gösterir.

güncelleme 3:

Özyineleme eklemek için, satırların sıralamasını sortkomuta bırakıp, sıralamak için 5. sütunu kullanmasını söylerdim.

ls -lR | grep '^-' | sort -k 5 -rn

-rnEn üstteki en büyük dosyaları elde etmek için Ters ve sayısal anlamına gelir. Bu komutun aşağı tarafı, dosyaların tam yolunu göstermemesidir.

Dosyaların tam yoluna ihtiyacınız varsa, bunun gibi bir şey kullanın:

find . -type f  -exec du -h {} + | sort -r -h

findKomut ardışık tüm alt dizinleri tüm dosyaları bulacaksınız .ve çağrı du -h(anlam -humanreadable disk kullanımı ) ve daha sonra tekrar çıkış sıralamak. Senin Eğer find/ sortdesteklemez -h, ile değiştirin du -kve sort -rn. Not boyut ve disk kullanımı aynı şey değildir.


5
dudosya boyutundan farklı olan disk kullanımını verir. (GNU) du -hile sayısal sıralama çalışmaz ( -hsıralamak için GNU seçeneğine ihtiyacınız olacaktır ). xargs, girdi olarak muhtemel olarak yazılmış kelimelerin bir listesini bekler, böylece dosya isimleri boşluk veya alıntı karakterleri içeriyorsa işe yaramaz.
Stéphane Chazelas

1
Görüyorum ki -S azalan boyut düzeninde, artan düzen ne durumda?
demongolem

3
StéphaneChazelas @ takiben, bu benim için çalışıyor: find . -type f -print0 | xargs -0 du -h | sort -rh. Sadece büyük 30 dosya söylemek isterseniz: find . -type f -print0 | xargs -0 du -h | sort -rh | head -n 30.
user7543 16:16

Selam! Lütfen içindeki + |sözdizimini açıklayabilir misiniz + | sort -r -h?
Victor


25

Bulmak ve sıralamak gibi bir şey kullanabilirsiniz.

find . -type f -ls | sort -r -n -k7

( -lsseçenek standart değildir, ancak yalnızca GNU olanı değil birçok bulma uygulamasında bulunur. GNU bul ve diğerlerinde, ls -libirkaç istisna dışında benzer bir şey görüntüler , örneğin, ACL'li dosyalar + ile işaretlenmemiş)

Dosya adları newline karakterleri içeriyorsa, GNU find ve GNU sort ile:

find . -type f -ls -printf '\0' | sort -zk7rn | tr -d '\0'

Bu boşluk ("-k 7 parametresi) içermeyen" grup "sütununun (-ls'den) olduğunu varsayar, ancak böyle olması gerekmez.
kolistivra

1
neden sadece bulmuyorsun ... -print0 | sıralama -zk7rn0?
Andre de Miranda

10

Zsh ve GNU ls ile:

ls -ldU -- **/*(.OL)

Nerede (.OL)bir olan topak eleme , .seçmek için düzenli , sadece dosyaları OL(dosya boyutu uzunluğuyla sırasını tersine çevirmek için o , küçükten büyüğe için Oazalan için).

(zsh’nın eski sürümlerinde 2 ^ 32’den büyük dosya boyutlarında sorun olduğunu unutmayın).

Bazı işletim sistemlerinin bir komuta iletilen argüman listesinin boyutu üzerinde bir sınırı vardır. Bu gibi durumlarda, ihtiyacınız olacak:

autoload -U zargs
zargs ./**/*(.OL) -- ls -ldU

Ayrıntılı çıktıyı değil sadece dosya listesini istiyorsanız, sadece yapın:

print -rl -- **/*(.OL)

Gizli dosyaları dahil etmek (adı .ve hariç bir noktayla başlayan ..) ve gizli dizinlerde de arama yapmak istiyorsanız , Dgenelleme niteleyicisini ekleyin :

print -rl -- **/*(.DOL)

ne yapar .OL? Bu komutun bir parçası mı?
alpha_989

@ alpha_989, bkz. düzenleme
Stéphane Chazelas

Açıklama için teşekkürler, Stephane .. Ancak, bir sebepten dolayı ... komut benim iş istasyonumda çalışmıyor .. ls (GNU coreutils) 8.25ve kullanıyorum zsh 5.1.1 (x86_64-ubuntu-linux-gnu). O belirli sürümlerinde sadece çalışır mı lsve zsh?
alpha_989

@ alpha_989, hangi şekilde sizin için çalışmıyor? Bu benim için aynı sürümlerle çalışıyor ve bu kodda en az 15 yıl önceki sürümlerde çalışmayan hiçbir şey yok.
Stéphane Chazelas

9

Dosyaları artan boyuta göre listelemek:

ls -lSr

Seçenekler şunlardır:

  • l: uzun, detaylı kullanıcı, grup, diğer özellikler, tarih vb.
  • S: Boyuta göre listelenen siparişler (varsayılan olarak azalan)
  • r: listeleme sırasını tersine çevirir

Cevabın kalitesini arttırmaya yönelik seçenekleri açıklar mısınız?
Rui F Ribeiro

6

"Dosyalar belirli bir klasörde herhangi bir yerde bulunabilir" demek, başlangıç ​​dizinindeki (klasör) tüm dizinleri (klasörler) tekrarlı bir şekilde açmak istediğinizi belirtir. Bu nedir findyapmak anlamına gelir:

find . -type f -exec ls -lSd {} +

Bu , geçerli çalışma dizinindeki ( ) tüm dosyaları "bulur" .. Bulunan her dosya lsiçin, boyut sırasına göre bulunan nesneleri sıralamak için bir işlem çalıştırılır. +İçin sonlandırıcı -execnedeni çok bağımsız değişkenler için bir liste olarak geçirilmesi için ls. Dizininiz (klasörünüz) çok fazla sayıda dosya içermiyorsa, istediğiniz sonuca yol açacak bir listeye (ve böylece bir çatal forma) sahip olmalısınız.


1
Bu, güzel dosya boyutlarını göstermek için ls üzerinde -h değiştiricisini kullanmanıza izin verdiği için güzel
shmish111 16:15

4

Dosya listesi ekranı ters sırada: ls -lSrh

Artan sipariş için: ls -lSh


1
-H işaretini insan dostu çıktı için kullanmak için +1.
computingfreak

2

Bir süre önce bu ölçüde bir şey yazdım. Kaç tane dosya listeleneceğini belirtmek için bir argüman iletebilir ya da sadece bighangi durumda 10 alırsanız yazabilirsiniz .

big () { 
    NUM_FILES=10;
    if [ $1 ]; then
        NUM_FILES=$1;
    fi;
    du | sort -nr | head -n $NUM_FILES
}

2

Bunları dene, benim için iyi çalışıyor.

$ find /home/san -type f -printf '%s %p\n'| sort -nr | head -n 10

# find /root -type f -exec ls -lS {} + | head -n 10 | awk '{ print $5, $9 }'

Mükemmel cevap olmasa da bir ölçüde çalışır

$ ls -lS |grep  '^-' | head -n 6 

1
Dosya adları boşluk içermiyorsa, awk düzgün çalışır.
Eir Nym

evet .. 'sed' kullanın ve boşluğu alt çizgi ile değiştirin. Bu yardımcı olur
Sand1512

Hayır, sedçıktıyı kesmek için kullanıyorum
Eir Nym

1

Delh'in cevabına ve Stéphane Chazelas'ın yorumuna ...

find -print0ile birlikte xargs -0boşluklar / boşluklar / whatnots için destek ekler.

du -h | sort -rn farklı bayt katları arasında doğru bir şekilde sıralama yapmaz; örneğin 1.1M, 128K'dan sonra yanlış olanı gösterir.

sort -rh (--human-numeric-sort) bununla ilgilenir, ancak yalnızca GNU'nun sürümünde çalışır.

Aşağıdaki komutlar istenen çıkışı sağlayacaktır.

GNU’nun sıralama / Linux’undan okunabilir:

find . -type f -print0 | xargs -0 du -h | sort -rh

Kilobayt biriminde, BSD / OSX / diğerlerinde:

find . -type f -print0 | xargs -0 du -k | sort -rn

BSD / OSX için ayrıca bkz: https://unix.stackexchange.com/a/188375/82895 .


1

Orijinal sorunun bir varyasyonu olarak, alt dizinlerdeki dosyaların kümülatif boyutunu görmek istiyorsanız:

#!/bin/bash
find ${1:-.} -maxdepth 1 -type d -exec du -sm {} \; | sort -nr

Boyutlar Megabayt ( min du -sm) olarak gösterilecektir . Tarafından kabul Diğer değerler duvardır -k, kilobayt için -ggigabayt için. -hİnsan tarafından okunabilir bir ekran kullanmak mümkün değildir çünkü sıralamayı bozar.

İşte megabayt sedeklemek için kullanılan bir sürüm M:

find ${1:-.} -maxdepth 1  -type d  -exec du -sm {} \; | sort -nr | sed -E 's/^([0-9]+)/\1M/g'

Görüntülenecek dizin, ${1:-.}sağlandığı takdirde ilk komut satırı argümanını kullanacak ya da argümanlar olmadan çağrılırsa geçerli dizini kullanacak şekilde ayarlanır .

NOT: Bu çok fazla dosyayla uzun sürebilir. Bu seçenek -type dyalnızca alt dizinleri listeleyecek ve geçerli klasördeki dosyaları hariç tutacaktır; dosyaları da geçerli klasörde görmek istiyorsanız, o zaman kaldırın.

Not: ncdubunun yerine çoğu linux reposunda (ubuntu / debian'da apt install ncdu) ve osx'de ( brew install ncdu) kullanılabilir olanı kullanmak isteyebilirsiniz .

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.