En büyük dosyaları veya dizinleri bulun


10

Hangi komut, tmp dizinindeki (gizli olanlar dahil) tüm dosya ve dizinlerin boyutlarını yazdırır ve bunları okunabilir biçimde (örneğin 2 GB) en büyükten en küçüğe boyutlara göre sıralar?

Çıktı aşağıdaki gibi olabilir:

file.mpg 2GB
file.avi 1.8GB
.backtup 1.7 GB (this is directory)

lsVe dukomutlarını kullanmaya çalıştım ama doğru anahtarları bulamadım.

Yanıtlar:


7

İşte hızlı bir düzeltme, du + sort kullanın. Bunu dene:

du -smc * | sort -n

Bu, gizli dosyaları yok sayar, ancak bu başka bir kolay çözümdür:

du -smc .[^.] .??* * | sort -n

Bu, yukarıdaki kalıplardan bir veya daha fazlasının bir dosyayla eşleşmemesi durumunda uyarılara neden olabilir. İlk kalıp, .[^.]ile başlayan iki karakter dosya adının tümü ile eşleşir. .. hariç, ikinci kalıp, .??*üç harf veya daha fazla dosya adıyla başlayarak eşleşir. ve * ile başlamayan tüm dosyalarla eşleşir. Tüm bir dosya sisteminde X'ten büyük tüm dosyaları bulma veya dosya sistemi büyüme listesini koruma gibi daha karmaşık bir liste için, yazdığım ve ilgilendiğinizde paylaşabileceğim bazı DIY kabuk komut dosyası var.


Teşekkür ederim. Bu kadar kibar olursanız senaryonuzla ilgileniyorum.
xralf

1
sort -nrEn büyük değerleri en üstte istiyorsanız kullanın .
LawrenceC

3

Dosyaları, herhangi bir yere /tmp, boyuta göre sıralamak için:

find /tmp -type f -exec du -k {} + | sort -k1n -k2

Hemen altındaki dosyaları ve dizin ağaçlarını /tmpboyuta göre sıralamak için:

du -k /tmp/..?* /tmp/.[!.]* /tmp* 2>/dev/null | sort -k1n -k2

Tüm dosyaları ve dizin ağaçlarını /tmpboyutlarına göre sıralanmış olarak herhangi bir yerde listelemek için :

du -ak /tmp | sort -k1n -k2

(Üç komut arasındaki farkı gösteren bir örnek: bir dosya varsa /tmp/dir/file, ilk komut listeleri /tmp/dir/file, ikinci listeler /tmp/dirve üçüncü listeler.

Yukarıdaki tüm komutlar boyutları kilobayt cinsinden gösterir. GNU du “insan tarafından okunabilir” boyutlar (k, M, G, vb. Çarpanları ile) çıktılarken, bunları sıralamak başka bir konudur. Son yeterince GNU coreutils (≥7.4) yapabilirsiniz: sadece yerini du -kile du -hve sort -k1n -k2ile sort -k1h -k2. Aksi takdirde, ekli boyutlara (yuvarlama) dönüştürmek için ham bir awk betiği; sadece sortyukarıdaki çıkışı boruya geçirin .

awk -vFS='\t' -vOFS='\t' '{
    if ($1) $1 = substr($1,1,(length($1)-1)%3+1)
                 substr("kMGTPEZY",(length($1)-1)/3+1,1);
    print}'

Teşekkür ederim. Bunlar komutlar yararlıdır, ama doğrudan tmp altında dosya ve dizinleri sadece ilgilenen kulüpler değil, alt dizinlerinde dosyalar
xralf

1
@xralf: O zaman sadece ikinci duçağrı biçimini kullanın .
Gilles 'SO- kötü olmayı durdur'

İyi görünüyor, ancak daha iyi sonuç MB ve GB ile forcefsck gönderildi.
xralf

3

Bunun için aşağıdaki takma adı kullanıyorum: alias ds='du -x --all --max-depth=1 . | sort -n'

Tüm dosyaların boyutlarını ve geçerli dizinin 1. düzey alt dizinlerini yazdırır.


Güzel kısa bir çözüm, ancak sadece dizinleri yazdırıyor.
xralf

Üzgünüm, haklısın. Dosyalarda bu sorunla hiç karşılaşmadım. Ancak, dosyalar ile nasıl çalışacağını buldum: using --all swicth.
rvs

Doğru çözüm. MB cinsinden boyutları gösterdiğinden penguin359 biraz daha iyidir. En iyisi forcefsck'in çözümü olurdu, ancak çözümü dizinleri boşluklarla atlar.
xralf

1

GNU sort'in mevcut sürümü ile (ve borçlanma @ penguin359 dosya deseni)

cd /tmp; du -sShc .[^.] .??* * | sort -h

Daha eski bir sürümle

cd /tmp
foo=$(du -sShc .[^.] .??* *)
for u in K M G T; do
    echo "$foo" | egrep "^[0-9\.]+$u" | sort -n
done

EDIT: alt dizinler içermemek için -S parametresi eklendi du.


Oldukça doğrudan tmp (alt dizinler değil) altında dosya ve dizinler (içinde toplam veri boyutu) tarafından kullanılan disk alanı istedim. Sıralama komutumda -h seçeneği yok.
xralf

Aynı dosya deseni seçimiyle bir yanıtı zaten kabul ettiğiniz için ne demek istediğinizden% 100 emin değilim. Yazımı alt dizin içermeyecek şekilde düzenledi. Kullanılan gerçek disk alanını değil, görünen boyutu istiyorsanız --apparent-sizedu parametrelerine ekleyebilirsiniz .
forcefsck

Şimdi güzel çalışıyor. Sadece GB ve sonra MB'yi aramam gerekiyor, ama bu bir sorun değil.
xralf

Birim harfleri yanlış sırada, şimdi düzeltildi. Büyükten küçüğe sıralamayı istiyorsanız, birim harflerinin sırasını değiştirin ve sıralamak için -r ekleyin.
forcefsck

Fark ettim, dizinin boyutunu yazdırmayı unuttum (önek olmadan)
xralf

0

GÜNCELLEME: Bir önceki betiği hurdaya ayırdım. İşte duve kullanarak yeni bir sürüm awk (önceki sürüm treeve sed)

Bu çıktı: dusort ~/test 1

================
dir     4.10 KiB  /home/user/test/bdir
dir     4.98 KiB  /home/user/test/Kdir
dir   104.91 MiB  /home/user/test/Mdir
dir   587.47 MiB  /home/user/test/Gdir
dir   692.39 MiB  /home/user/test
================
 f      0    Byt  /home/user/test/new file
 f     42    Byt  /home/user/test/.hi   dd     en
================

İşte senaryo

units() { awk -v pfix="$1" \
  'BEGIN { yect=6  # Array element-count
    split("Byt KiB MiB GiB TiB PiB",lbl)
    for (i=1;i<=yect;i++) { val[i] = (2**(10*(i-1)))-1 } 
  }
  { yess=yect  # Array element-subscript
    while ( $1 < val[yess] ){ yess-- }
    num = $1 / (val[yess]+1)
    sub(/^[0-9]*\t*/,"")
    if (yess!=1) { printf "%s %8.2f %s  %s\n", pfix, num, lbl[yess], $0 }
    else        { printf "%s %5d    %s  %s\n", pfix, num, lbl[yess], $0 }
   }'
}
tdir="/tmp/$USER/$(basename $0)"
[[ ! -d "$tdir" ]] && mkdir -p "$tdir"
file="$tdir/$(date +%N)"
echo "================"
dirs="$file.dirs";   du --max-depth=$2 -b $1  >"$dirs" ; <"$dirs"  sort -n           | units "dir"
echo "================"
filz="$file.filz"; { du --max-depth=$2 -ab $1 ; cat "$dirs" ; } | sort -n | uniq -u  | units " f "
echo "================"
rm   "$file."* 
#

Tüm dosya ve dizinlerin boyutlarını söylediğinizde , her öğenin diskte kapladığı alanı mı kastediyorsunuz (örn. Ubuntu ext4 dosya sistemimde , boş bir dizin 4 k disk alanı ve 4 k'dan küçük bir dosya 4 k kaplıyor Minimum tahsis yığını 4k) .. ya da her dosyadaki veri miktarını mı kastediyorsunuz , örneğin, 100 (bayt) .. Ve dizinler için, o dizindeki dosya verilerinin toplamını bilmek istiyor musunuz .. dosyaların içindeki verilerin boyutunu istiyorsanız, bunu yaparsınız tree. disk alanı kullanılmasını istiyorsanız, o zaman dubunu yapar ... ( treebir dizin toplam değil)
Peter.O

'du' daha iyi bir seçim ... Ben de farkettim man duki , normal dosyalarda "görünür dosya boyutu" .... The apparent size of a file is the number of bytes reported by wc -c ' ls -l --block-size=1' or bildirebilir , ya da daha genel olarak, stat --format =% s'. Örneğin, kelime içeren bir dosyazoo' with no newline would, of course, have an apparent size of 3.
Peter.O

Ben doğrudan tmp (alt dizinler değil) altında dosya ve dizinler (içinde toplam veri boyutu) tarafından kullanılan disk alanı istedim
xralf

Üzgünüm, henüz anlayabildiğim kabuk komut dosyası oluşturma aşamasında değilim, bu yüzden diğer kullanıcılara ne kadar iyi yanıt verdiğine karar verdim. Çalışmanız için teşekkürler. Daha iyi olduğumda çalışacağım.
xralf

0
find /tmp -exec du {} + | sort -nr | less 

önce en büyük dosyaları gösterir, böylece qyeterince gördüğünüzde uit edebilirsiniz .

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.