Bash'de her dosyanın ve dizinin boyutu nasıl listelenir ve azalan boyuta göre nasıl sıralanır?


108

Bash'de bir dizinin boyutuna ulaşmanın kolay olmadığını anladım.

Ben yazarken bunu istiyorum ls -<some options>, aynı anda ve sıralama boyut emriyle yinelemeli dizin ve dosyaların dosya boyutunun tüm toplamının listeleyebilirsiniz.

Mümkün mü?


2
Bir dizinin "boyutu" ile tam olarak neyi kastediyorsunuz? Altındaki dosyaların sayısı (özyinelemeli veya değil)? Altındaki dosyaların boyutlarının toplamı (özyinelemeli veya değil)? Dizinin kendisinin disk boyutu? (Bir dizin, dosya adlarını ve diğer bilgileri içeren özel bir dosya olarak uygulanır.)
Keith Thompson

Yinelemeli olarak altındaki dosyaların boyutlarının toplamı olmalıdır
Kit Ho

1
@Kit: O zaman ducevap.
Keith Thompson

@KeithThompson @KitHo dukomutu dosya alanı kullanımını tahmin eder, böylece tam boyutu elde etmek istiyorsanız onu kullanamazsınız.
ztank1013

@ ztank1013: "Tam boyut" ile ne demek istediğinize bağlı olarak, du(en azından GNU coreutils sürümü) muhtemelen bilgiyi sağlama seçeneğine sahiptir.
Keith Thompson

Yanıtlar:


218

Sadece dizine gidin ve aşağıdaki komutu çalıştırın:

du -a --max-depth=1 | sort -n

VEYA daha büyük dizinleri / dosyaları yazdırmak için insan tarafından okunabilir boyutlar için -h ve -r ekleyin.

du -a -h --max-depth=1 | sort -hr

23
du -hdaha önce sıraladığından sort -hemin olmak için de gerektirir ; ile yalnızca sayılar dikkate alınacağını ve bunlar yanlış bir yol yuvarlak olurdu. 981M1.3Gsort -n
Smylers

Bu, geçerli dizindeki tek tek dosyaların boyutunu değil, yalnızca alt dizinlerinin boyutunu ve geçerli dizinin toplam boyutunu listeler. Çıktıya tek tek dosyaları nasıl dahil edersiniz (OP'nin sorusuna cevap vermek için)?
Erik Trautman

@ErikTrautman Eklemek gerekir ayrıca dosyaları listelemek -ave kullanımı --allyerine --max-depth=1şöyledu -a -h --all | sort -h
Franco

Müthiş! Birkaç yıldır daha zayıf bir şey yapıyorum. :)
Colby Blair

6
sort -hyalnızca GNU'nun / Linux sürümünde çalışır, BSD / OS X'te şans yoktur.
djule5

20

Görünüşe göre --max-depthseçenek, Mac OS X'in dukomut sürümünde değil . Bunun yerine aşağıdakileri kullanabilirsiniz.

du -h -d 1 | sort -n


Görünüşe göre, ama şaşırtıcı değil.
Josh Habdas

20
du -s -- * | sort -n

(bu, gizli (.dotfiles) dosyaları göstermez)

Kullanım du -smMb birimler vb Hep kullanım için

du -smc -- * | sort -n

çünkü -caçık nedenlerden dolayı toplam satırı ( ) en altta bitecek :)

Not:

  • Nokta dosyalarının işlenmesine ilişkin yorumlara bakın
  • Sık sık kullanıyorum, örneğin 'du -smc / home / / | büyük bitlerin tam olarak nerede oturduğuna dair bir fikir edinmek için sort -n | tail '

5
du --max-depth=1|sort -nveya find . -mindepth 1 -maxdepth 1|xargs du -s|sort -ndotfiles dahil etmek için.
Arnaud Le Blanc

@arnoud: Bunu ben de kullanıyorum, ancak bu soru için doğru ekleme (/ cevap) gibi
görünmedi

@ arnaud576875 find . -mindepth 1 -maxdepth 1 -print0 | xargs -0 du -s | sort -nbulunan yollardan bazıları boşluk içeriyorsa.
Lri

1
Bu, en büyüğünün insan tarafından okunabilir bir görüntüsünü elde etmek için harika bir varyant:sudo du -smch * | sort -h | tail
marsbard

16

komuta

du -h --max-depth=0 * | sort -hr

Çıktı

3,5M    asdf.6000.gz
3,4M    asdf.4000.gz
3,2M    asdf.2000.gz
2,5M    xyz.PT.gz
136K    xyz.6000.gz
116K    xyz.6000p.gz
88K test.4000.gz
76K test.4000p.gz
44K test.2000.gz
8,0K    desc.common.tcl
8,0K    wer.2000p.gz
8,0K    wer.2000.gz
4,0K    ttree.3

açıklama

  • du "disk kullanımını" gösterir
  • h "insan tarafından okunabilir" içindir (hem sıralama hem de du olarak)
  • max-depth=0dualt klasör boyutlarını göstermeyeceği anlamına gelir (her alt, alt alt, ..., klasördeki her dosyanın tüm boyutlarını göstermek istiyorsanız bunu kaldırın)
  • r "ters" içindir (önce en büyük dosya)

ncdu

Bu soruya geldiğimde dosya sistemimi temizlemek istedim. Komut satırı aracı ncdubu göreve çok daha uygundur.

Ubuntu'ya kurulum:

$ sudo apt-get install ncdu

Kullanımı:

ncdu [path]Komut satırını yazmanız yeterlidir. Yolu analiz ettiğiniz birkaç saniye sonra, şuna benzer bir şey göreceksiniz:

$ ncdu 1.11 ~ Use the arrow keys to navigate, press ? for help
--- / ---------------------------------------------------------
.  96,1 GiB [##########] /home
.  17,7 GiB [#         ] /usr
.   4,5 GiB [          ] /var
    1,1 GiB [          ] /lib
  732,1 MiB [          ] /opt
. 275,6 MiB [          ] /boot
  198,0 MiB [          ] /storage
. 153,5 MiB [          ] /run
.  16,6 MiB [          ] /etc
   13,5 MiB [          ] /bin
   11,3 MiB [          ] /sbin
.   8,8 MiB [          ] /tmp
.   2,2 MiB [          ] /dev
!  16,0 KiB [          ] /lost+found
    8,0 KiB [          ] /media
    8,0 KiB [          ] /snap
    4,0 KiB [          ] /lib64
e   4,0 KiB [          ] /srv
!   4,0 KiB [          ] /root
e   4,0 KiB [          ] /mnt
e   4,0 KiB [          ] /cdrom
.   0,0   B [          ] /proc
.   0,0   B [          ] /sys
@   0,0   B [          ]  initrd.img.old
@   0,0   B [          ]  initrd.img
@   0,0   B [          ]  vmlinuz.old
@   0,0   B [          ]  vmlinuz

Şu anda vurgulanan öğeyi ile silin, + ile dçıkınCTRLc


Du -hs * | sıralama -hr. -s (özetle), --max-deep = 0 ile aynıdır
rasmusx

5

ls -Sboyuta göre sıralar. Daha sonra, boyutu da göstermek için, ls -lSuzun ( -l), boyuta göre sıralanmış ( -S) bir ekran verir. Genelde -hokumayı kolaylaştırmak için ben de eklerim ls -lhS.


1
Ah, pardon, gönderinizden anlaşılmadı. İstediğiniz du, biri göndermiş gibi görünüyor. @sehe: Gerçek tanımınıza bağlıdır - dizinin kendisini depolamak için kullandığı alan miktarını gösterir. (Alt girişlerin boyutunu da eklemiyor.) Rastgele bir sayı değil ve her zaman 4KiB değil.
Thanatos

1

Basit ve hızlı:

find . -mindepth 1 -maxdepth 1 -type d | parallel du -s | sort -n

* GNU Parallel gerektirir .


0

Sanırım ne yapmak istediğini anlamış olabilirim. Bu, tüm dosyaların ve tüm dizinlerin, dosya boyutuna ve dizinlerdeki içeriğin boyutuna göre sıralanmış bir listesini verecektir.

(find . -depth 1 -type f -exec ls -s {} \;; find . -depth 1 -type d -exec du -s {} \;) | sort -n

Boşver, sehe çok daha basit bir çözüm sundu. Her gün yeni bir şey öğreniyorum!
dvorak

Kullanmanın dubir seçenek olduğunu düşünmüyorum , size sadece yaklaşık bir sonuç verecektir.
ztank1013

0

[geliştirilmiş sürüm]
Bu, aşağıdaki ilk sürümden çok daha hızlı ve hassas olacak ve geçerli dizinin tüm dosya boyutlarının toplamını verecektir:

echo `find . -type f -exec stat -c %s {} \; | tr '\n' '+' | sed 's/+$//g'` | bc

stat -c %sBir dosya üzerinde komut bayt boyutunu dönecektir. Buradaki trkomut, xargskomut sınırlamalarının üstesinden gelmek için kullanılır (görünüşe göre borulama xargs, sonuçları daha fazla satıra bölmek, komutumun mantığını bozmaktır). Bu nedenle trsatır beslemesini +(artı) işaretiyle değiştirmeye özen gösterir . sedsondan +gelen şikayetleri önlemek için sonuçtaki dizeden son işareti kaldırmak için tek amacı vardır.bcHer zamanki gibi matematik işlemlerini (temel hesap makinesi) komutundan .

Performanslar: Birkaç dizinde test ettim ve en üstte ~ 150.000'den fazla dosya (fedora 15 kutumun mevcut dosya sayısı) şaşırtıcı bir sonuç olduğuna inandığım sonuçlar:

# time echo `find / -type f -exec stat -c %s {} \; | tr '\n' '+' | sed 's/+$//g'` | bc
12671767700

real    2m19.164s
user    0m2.039s
sys 0m14.850s

Komutla bir karşılaştırma yapmak istemeniz durumunda du -sb /, bayt cinsinden tahmini bir disk kullanımı çıkaracaktır ( -bisteğe bağlı)

# du -sb /
12684646920 /

Beklediğim gibi, komut hesaplamamdan biraz daha büyük çünkü duyardımcı program, her dosya için ayrılmış alanı döndürüyor, gerçek tüketilen alanı değil.

[ilk sürüm] Klasörünüzün tam toplam boyutunu bilmeniz gerekiyorsa komutu
kullanamazsınız du, çünkü (kılavuz sayfası alıntıya göre) dudosya alanı kullanımını tahmin eder. Bu nedenle, sizi yanlış bir sonuca, bir yaklaşıma (belki toplam boyuta yakın ancak büyük olasılıkla aradığınız gerçek boyuttan daha büyük) yönlendirecektir.

Sorunuzu yanıtlamanın farklı yolları olabileceğini düşünüyorum ama bu benim:

ls -l $(find . -type f | xargs) | cut -d" " -f5 | xargs | sed 's/\ /+/g'| bc

Altındaki tüm dosyaları bulur. dizini (istediğiniz dizini değiştirin), gizli dosyalar da dahil edilir ve (kullanarak xargs) adlarını tek bir satırda çıkarır, ardından kullanarak ayrıntılı bir liste oluşturur ls -l. Bu (bazen) çok büyük çıktı kesme komutuna yönlendirilir ve yalnızca -f5bayt cinsinden dosya boyutu olan beşinci alan ( ) alınır ve yine xargsboşluklarla ayrılmış tek bir boyut satırı üretir. Şimdi, her boş alanı bir artı ( +) işaretiyle değiştiren ve son olarak bc(temel hesap makinesi) matematiği yapan bir sed büyü gerçekleştirin .

Ek ayar gerektirebilir ve lsargümanlar listesi hakkında çok uzun süre şikayet eden komutunuz olabilir .


diretory çok büyükse, uzun süre telefonu kapatır, ana dizininizde çalışmayı deneyin: p
Kit Ho

@KitHo peki, korkarım her bir dosyayı aramadan ve boyutunu eklemeden kesin bir sonuç elde etmenin kolay ve hızlı bir yolu yoktur, bu nedenle komut tembelliği esas olarak aranan dizinin altında kaç dosya olduğuna bağlıdır ... Ama ben orada olduğuna inanıyorum iyileştirme marjı ... güzel meydan okuma!
ztank1013

@KitHo merhaba, cevabımdaki gelişmiş sürüme bir göz atın ... ve tabii ki bana haber verin!
ztank1013

0

Başka bir basit çözüm.

$ for entry in $(ls); do du -s "$entry"; done | sort -n

sonuç gibi görünecek

2900    tmp
6781    boot
8428    bin
24932   lib64
34436   sbin
90084   var
106676  etc
125216  lib
3313136 usr
4828700 opt

"du -s" yi "du -sh" olarak değiştirmek insan tarafından okunabilir boyutu gösterecektir, ancak bu yöntemde sıralama yapamayacağız.


0

dosyaları boyuta göre listelemek için aşağıdakileri kullanabilirsiniz du -h | sırala -hr | daha fazla veya du -h --max-derinlik = 0 * | sırala -hr | Daha


0

Du'yu basit bir şekilde kullanma eğilimindeyim.

du -sh */ | sort -n

Bu bana hangi dizinlerin en çok yer kapladığına dair bir fikir veriyor. Daha sonra daha hassas aramalar yapabilirim.


Bu tür çalışır, ancak sıralama sırasında dosya boyutundaki birimleri yok sayar.
Benjamin Engwall
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.