Bir dizindeki ve alt dizinlerindeki en büyük dosya nasıl bulunur?


102

Bir UNIX sınıfına yeni başlıyoruz ve çeşitli Bash komutlarını öğreniyoruz. Görevimiz, altında birkaç klasör bulunan bir dizinde çeşitli komutlar gerçekleştirmeyi içerir.

Kök klasördeki tüm normal dosyaları nasıl listeleyeceğimi ve sayacağımı biliyorum:

find . -type l | wc -l

Ancak tüm dizindeki en büyük dosyayı bulmak için oradan nereye gideceğimi bilmek istiyorum. Bir dukomutla ilgili bazı şeyler gördüm , ancak bunu öğrenmedik, bu yüzden öğrendiğimiz şeylerin repertuarında onu bir şekilde ls -tkomuta bağlamamız gerektiğini varsayıyorum .

Ve 'lingo'm doğru değilse affedin, yine de alışmaya başladım!


2
Bir komutu biliyorsanız, ancak nasıl kullanacağınızdan emin mandeğilseniz, ardından ilgilendiğiniz komutu yazmayı deneyin . Yukarı, bu komut için güzel bir manuel giriş açacaktır ( qkomut satırına geri dönmek için basın ).
Dunes

Yanıtlar:


126

Bu bağlantıdan alıntı

Belirli bir dizinde ve alt dizinlerinde ilk 10 büyük dosya adını (dizinler değil) bulmak ve yazdırmak istiyorsanız

$ find . -printf '%s %p\n'|sort -nr|head

Aramayı mevcut dizine sınırlamak için find ile "-maxdepth 1" kullanın.

$ find . -maxdepth 1 -printf '%s %p\n'|sort -nr|head

Ve en büyük 10 "dosya ve dizini" yazdırmak için:

$ du -a . | sort -nr | head

** En büyük X büyük dosyayı yazdırmak için yukarıdaki tek "head" yerine "head -n X" kullanın (yukarıdaki tüm örneklerde)


1
"Du -a. | Sort -nr | head" neden gerçek dosya boyutunun iki katı KB sayısını döndürüyor?
xxjjnn

6
Ah, 'k' seçeneğini eklemeniz gerekiyor, yoksa 1024 bayt yerine 512 baytın katlarını gösteriyor. Du -ak
xxjjnn

2
İlki için, boyutu insan tarafından okunabilir bir formatta nasıl elde edersiniz?
Bluz

@Bluz '%s %p\n'ile değiştirmeyi '%p\n've |xargs ls -lhsonuna eklemeyi denerdim
Duncan X Simpson

6
İ üçüncü çözeltisinden dizinlere dışarı filtreye hızlı kesmek kullanarak sona erdi bu yüzden ilk çözüm, benim için OS X üzerinde işe yaramadı: du -am . | sort -nr | grep '\..*\.' | head. mMegabayt olarak görüntü dosya boyutu ve kullanılan grepilk olan, en az iki nokta ile göstermek hatlarına ./yolunda, ikinci, örneğin dosya uzantısı, içinde .mov.
psmith

63

Geçerli dizinde ve alt dizinlerinde bulunan ilk 25 dosyayı bulmak için:

find . -type f -exec ls -al {} \; | sort -nr -k5 | head -n 25

Bu, "sort -nr -k5" borulu komutuyla dosyaların boyutuna göre sıralayarak ilk 25 dosyayı çıkaracaktır.

Aynı, ancak insan tarafından okunabilen dosya boyutlarıyla:

find . -type f -exec ls -alh {} \; | sort -hr -k5 | head -n 25


10
find . -type f | xargs ls -lS | head -n 1

çıktılar

-rw-r--r--  1 nneonneo  staff  9274991 Apr 11 02:29 ./devel/misc/test.out

Yalnızca dosya adını istiyorsanız:

find . -type f | xargs ls -1S | head -n 1

Bu, kullanmaktan kaçınır awkve istediğiniz bayrakları kullanmanıza izin verir ls.

Uyarı . Çok xargsuzun komut satırları oluşturmaktan kaçınmaya çalıştığından, onu çok sayıda dosya içeren bir dizinde çalıştırırsanız bu başarısız olabilir, çünkü lsbirden fazla kez çalıştırılır. Bu aşılamaz bir sorun değildir ( head -n 1her lsçağrıdan çıktıyı toplayabilir ve ls -Stek bir dosyaya sahip olana kadar döngü yaparak tekrar çalıştırabilirsiniz ), ancak bu yaklaşımı biraz bozar.


1
üzgünüm xargs, seni ihmal ettim +1
Steve

2
dosya adlarını boşluklarla işlemek için kullanınfind . -type f -print0 | xargs -0 ls -lS | head -n 1
rymo

Bu, yalnızca ilk partideki en büyük dosyaları xargsçalıştırır. Düzeltmek için bu sıralama ekleyin: find . -type f -print0 | xargs -0 ls -lS | sort -rk 5 | head -n 10. Benim için OSX üzerinde çalıştı.
psmith

10

Bir Linux / UNIX / BSD dosya sistemindeki en büyük dosyaları / dizinleri bulmak için basit bir komut yoktur. Ancak, aşağıdaki üç komutun birleşimiyle (borular kullanarak) en büyük dosyaların listesini kolayca bulabilirsiniz:

# du -a /var | sort -n -r | head -n 10

Daha fazla insan tarafından okunabilir çıktı istiyorsanız şunu deneyin:

$ cd /path/to/some/var
$ du -hsx * | sort -rh | head -10

Nerede,

  • Var , aramak istediğiniz dizindir
  • du command -h seçeneği: boyutları insan tarafından okunabilir biçimde görüntüler (örneğin, 1K, 234M, 2G).
  • du command -s seçeneği: her bağımsız değişken için yalnızca bir toplam gösterir (özet).
  • du command -x seçeneği: farklı dosya sistemlerindeki dizinleri atlayın.
  • sort komutu -r seçeneği: karşılaştırmaların sonucunu tersine çevirin.
  • sort komutu -h seçeneği: insan tarafından okunabilen sayıları karşılaştırın. Bu yalnızca GNU sıralamasına özgü seçenektir.
  • head command -10 VEYA -n 10 seçeneği: ilk 10 satırı gösterir.

2. komutu daha çok seviyorum ama osx'te sıralama sürümü için -h seçeneği kurulu değil. Mac için olmalı: du -hsx * | sırala -rn | kafa -10
Yann VR

1
İkinci emri sevdim! Denediklerimin en iyisi - onu sonrası için saklayacağım.
CodeMouse92

8

Bu, dosyaları normal dosyalarsa özyinelemeli olarak listeler, 7. alana göre sıralar (çıktımdaki boyuttur find; sizinkini kontrol edin) ve yalnızca ilk dosyayı gösterir.

find . -type f -ls | sort +7 | head -1

İlk seçenek find, özyinelemeli aramanın başlangıç ​​yoludur. A tipi fnormal dosyaları arar. Bunu bir dosya adı olarak ayrıştırmaya çalışırsanız, dosya adı boşluklar, satırsonları veya diğer özel karakterler içeriyorsa başarısız olabileceğinizi unutmayın. sortİşletim sistemine göre de değişiklik gösteren seçenekler . FreeBSD kullanıyorum.

"Daha iyi" ancak daha karmaşık ve daha ağır bir çözüm find, dizinleri taramak olabilir, ancak belki statdosya hakkında ayrıntıları almak için kullanın, sonra belki de awken büyük boyutu bulmak için kullanın . Çıktısının statişletim sisteminize de bağlı olduğunu unutmayın.


1
+7Argüman ne yapmalı? Benim makinemde sıralama adı verilen bir dosyayı bulamadığından şikayet ediyor +7.
Dunes

@Dunes - Dediğim gibi, sortsisteminizdeki man sayfasını kontrol edin . Ben FreeBSD sıralamadan kullanım türemiştir anda, OS X 10.4 kullanıyorum : sort [-cmus] [-t separator] [-o output-file] [-T tempdir] [-bdfiMnr] [+POS1 [-POS2]] [-k POS1[,POS2]] [file...]... Not +POS [-POS2]. Bu, FreeBSD'nin mevcut sürümlerinde de çalışır.
ghoti

2
Görünüşe göre bana göre farklı bir tasnif programı var. Bu benim sıralama programımın man sayfasıdır - linux.die.net/man/1/sort Bunun makinemde çalışması için arg'yi açıkça kullanmanız gerekir -k. sort -k 7. düzenleme: OSX 10.5'e göre sıralama için man sayfası, sahip olduğum sürüme değiştirilmiş görünüyor.
Dunes

1
@Dunes - Hepsi GNU sıralaması, ancak farklı sürümler. [+POS1] [-POS2]Notasyonu sadece eski bir tanesidir. Anladığım kadarıyla, bu gösterim hala modern GNU sıralaması tarafından destekleniyor, ancak şimdi baktığım zaman, 5.1 sürümünden sonra sort man sayfasından çıkarılmış gibi görünüyor. FreeBSD 4.11 için sıralama için man sayfasında görebilirsiniz . Sanırım FreeBSD 5.0 ​​piyasaya sürülmeden önce sıralama ana sayfasını okumadım!
ghoti

Ayrıca, +POS1sıralama parametrelerini sıfırdan -k POS1sayarken, birden itibaren saydığına dikkat edin .
ghoti

6

Bu, mevcut çalışma dizininizdeki en büyük dosya veya klasörü bulacaktır:

ls -S /path/to/folder | head -1

Tüm alt dizinlerdeki en büyük dosyayı bulmak için:

find /path/to/folder -type f -exec ls -s {} \; | sort -nr | awk 'NR==1 { $1=""; sub(/^ /, ""); print }'

Sanırım ls'nin varsayılan davranışı, dosyaları sütunlar halinde listelemektir (yani, satır başına birkaç girdi), bu nedenle ilki tam olarak en büyük dosyayı bulmaz. İkinci komutunuzla ilgili olarak, yalnızca verilen dizindeki en büyük dosyayı buldu, alt dizinlerini değil.
Dunes

@Dunes: Haklısın, ilk komut verebilir fakat bunun nedeni varsayılan davranışı nedeniyle, dizinleri bulmak ls. Benim testimde, -Sbayrak satır başına bir dosya listeleyecek. İkinci komutu düzelttim. Umarım şimdi tam kanıtıdır. Teşekkür ederim.
Steve

4

Solaris'te kullanıyorum:

find . -type f -ls|sort -nr -k7|awk 'NR==1{print $7,$11}' #formatted

veya

find . -type f -ls | sort -nrk7 | head -1 #unformatted

çünkü burada yayınlanan başka hiçbir şey işe yaramadı. Bu, $PWDve alt dizinlerdeki en büyük dosyayı bulacaktır .


2

Aşağıdaki tek satırlık uygulamayı deneyin (en büyük 20 dosyayı görüntüleyin):

ls -1Rs | sed -e "s/^ *//" | grep "^[0-9]" | sort -nr | head -n20

veya (insan tarafından okunabilen boyutlar):

ls -1Rhs | sed -e "s/^ *//" | grep "^[0-9]" | sort -hr | head -n20

Bul -printfseçeneği OSX / BSD'de bulunmadığından ve statişletim sistemine bağlı olarak farklı parametrelere sahip olduğundan , Linux / BSD / OSX altında diğer yanıtlarla karşılaştırıldığında iyi çalışır . Ancak OSX / BSD üzerinde çalışmaya İkinci komut düzgün (olarak sortyok -h), yüklemeye sortgelen coreutilsveya kaldırmak -hdanls ve kullanımı sort -nryerine.

Dolayısıyla, bu takma adlar rc dosyalarınızda bulunması yararlıdır :

alias big='du -ah . | sort -rh | head -20'
alias big-files='ls -1Rhs | sed -e "s/^ *//" | grep "^[0-9]" | sort -hr | head -n20'

Bu yalnızca dosya adını yol olmadan gösterir, bu nedenle en büyük dosyayı bulmaya gerçekten yardımcı olmaz.
psmith

En üstte benim için gerçekten en büyük dosyalara sahibim, ancak sonunda bu bana doğru dosyaları vermiyor
Borislav Markov

2

Aşağıdaki komutu deneyin:

find /your/path -printf "%k %p\n" | sort -g -k 1,1 | awk '{if($1 > 500000) print $1/1024 "MB" " " $2 }' |tail -n 1 

Bu, en büyük dosya adını ve boyutunu ve 500M'den fazla yazdıracaktır. Taşıyabilirsiniz if($1 > 500000)ve dizindeki en büyük dosyayı yazdıracaktır.


1

du -aS /PATH/TO/folder | sort -rn | head -2 | tail -1

veya

du -aS /PATH/TO/folder | sort -rn | awk 'NR==2'


0

Bu komut dosyası, daha fazla işlem için en büyük dosyaları bulmayı kolaylaştırır. Onu ~ / bin dizinimde tutuyorum ve $ PATH yoluma ~ / bin koyuyorum.

#!/usr/bin/env bash
# scriptname: above
# author: Jonathan D. Lettvin, 201401220235

# This finds files of size >= $1 (format ${count}[K|M|G|T], default 10G)
# using a reliable version-independent bash hash to relax find's -size syntax.
# Specifying size using 'T' for Terabytes is supported.
# Output size has units (K|M|G|T) in the left hand output column.

# Example:
#   ubuntu12.04$ above 1T
#   128T /proc/core

# http://stackoverflow.com/questions/1494178/how-to-define-hash-tables-in-bash
# Inspiration for hasch: thanks Adam Katz, Oct 18 2012 00:39
function hasch() { local hasch=`echo "$1" | cksum`; echo "${hasch//[!0-9]}"; }
function usage() { echo "Usage: $0 [{count}{k|K|m|M|g|G|t|T}"; exit 1; }
function arg1() {
    # Translate single arg (if present) into format usable by find.
    count=10; units=G;  # Default find -size argument to 10G.
    size=${count}${units}
    if [ -n "$1" ]; then
        for P in TT tT GG gG MM mM Kk kk; do xlat[`hasch ${P:0:1}`]="${P:1:1}"; done
        units=${xlat[`hasch ${1:(-1)}`]}; count=${1:0:(-1)}
        test -n "$units" || usage
        test -x $(echo "$count" | sed s/[0-9]//g) || usage
        if [ "$units" == "T" ]; then units="G"; let count=$count*1024; fi
        size=${count}${units}
    fi
}
function main() {
    sudo \
        find / -type f -size +$size -exec ls -lh {} \; 2>/dev/null | \
        awk '{ N=$5; fn=$9; for(i=10;i<=NF;i++){fn=fn" "$i};print N " " fn }'
}

arg1 $1
main $size

0

Bunu yapmanın oldukça basit yolu:

ls -l | tr -s " " " " | cut -d " " -f 5,9 | sort -n -r | head -n 1***

Ve bunu alacaksın: 8445 examples.desktop


Ne olduğunu 1***sonunda yapması gereken? Bu bağımsız değişken için "eşleşme bulunamadı" hatası alıyorum.
user4815162342

0

Linux Çözümü: Örneğin, dosya / klasör boyutuna ( Azalan sıra ) göre ev (/) dizininizin tüm dosya / klasör listesini görmek istiyorsunuz .

sudo du -xm / | sırala -rn | Daha


0

Daha büyük dosyayı bir klasörde listelemek için

ls -sh /pathFolder | sort -rh | head -n 1

Çıktısı , dosya boyutu numarasının ls -shboyutlu sve insan tarafından hanlaşılabilir bir görünümüdür.

Kullanabilirsin ls -shS /pathFolder | head -n 1. Daha büyük Sdan lszaten daha küçük olanları daha büyük dosyaları listesini sipariş ama önce bu klasördeki tüm dosyaların alt toplamı sonuçlanır. Yani sadece daha büyük dosyayı, tek bir dosyayı listelemek istiyorsanız head -n 2, "ikinci satır sonucunu" kontrol etmeniz veya ilk örneği ile kullanmanız gerekir ls sort head.


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.