En büyük dosyayı tekrarlı olarak bulma


41

Bir dizindeki en büyük dosyayı yinelemeli olarak bulmaya çalışıyorum. Bu dizinin içinde bir alt dizin varsa, işlevin o dizine girmesi ve en büyük dosyanın orada olup olmadığını kontrol etmesi gerekir. En büyük dosya bulunduktan sonra çıktı, göreceli yol adı ve en büyük dosyanın adı ve boyutu ile gösterilir.

EX:

dude@shell2 (~...assignment/solutions) % bash maxfile.sh ~/test
class/asn
dude.h.gch: 9481628

Elimde bu var:

#!/bin/sh
clear

recursiveS() {
    for d in *; do
        if [ -d $d ]; then
            (cd $d; echo $(pwd)/$line; du -a; recursiveS;)
        fi
    done
}
recursiveS

Bir süredir sıkışıp kaldım. Bunu, mevcut bir dizi Unix aracını birleştirerek uygulayamıyorum. Herhangi bir fikir güzel olurdu!



sadece alt dizinlere girmek için for d in */ .[^.]*/:; yap ... `
Olivier Dulac

Yanıtlar:


54

dosya adında dosya adlarını çıkarmak için find(burada GNU varsayarsak find) kullanın. çeşit. en büyüğünü yazdır.

find . -type f -printf "%s\t%p\n" | sort -n | tail -1

Bu, dosya yollarının yeni satır karakterleri içermediğini varsayar.


bashGNU’nun uygulanmasında bir döngü kullanmak stat:

shopt -s globstar
max_s=0
for f in **; do
  if [[ -f "$f" && ! -L "$f" ]]; then
    size=$( stat -c %s -- "$f" )
    if (( size > max_s )); then
      max_s=$size
      max_f=$f
    fi
  fi
done
echo "$max_s $max_f"

Bu, bulma çözümünden çok daha yavaş olacaktır. Bu aynı zamanda dosya adlarının yeni satır karakterleriyle bitmediğini ve gizli dosyaları atlayıp gizli dizinlere girmeyeceğini varsaymaktadır.

-Geçerli dizinde adı verilen bir dosya varsa , stdin'de açık olan dosyanın boyutu dikkate alınacaktır.

bashDizin ağacını alçaltırken 4.3'ten önceki sürümlerin sembolik bağlar izlediğine dikkat edin .


Teşekkürler, işe yarıyor! Yardımın için minnettarım. Programlamayı kabukta kullanmaya çalışıyorum. Şu an pek bir şey bilmiyorum, bu yüzden bu kod satırında neler olduğunu anlattığınız için teşekkür ederim.
user2419571

Hızlıca soru: Meraktan uzak, borulama komutları olmadan yapmanın bir yolu var mı? Merak ediyorum çünkü gördüğüm her örnek bir çeşit boru kullanıyor.
user2419571

2
Eminim bunu yapmanın başka yolları da vardır. UNIX felsefesi, araçların tek amaçlı olması ve onları bir araya getirerek bir komutun çıktısının bir sonrakinin girişine beslenmesi gerektiğidir.
glenn jackman

Bu mantıklı. Yardımlarınız için tekrar teşekkür ederim.
user2419571

2
@ user2419571 tail -n 1 <(sort -n <(find . -type f -printf "%s\t%p\n")):;)
Cyrus

9

Bu komut tanımlı boyutun da listelenmesine yardımcı olur.

find . -type f -size +100M -exec ls -lh {} \;

5

Bu, BSD / macOS'ta çalışır:

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

Ayrıca | head -n 3ilginç girişlerin sayısını görüntülemek için de ekleyebilirsiniz (bu durumda 3).


1
Bu cevap nasıl çalıştığını açıklayarak geliştirilebilir. Ayrıca, kabul edilen cevaba çok benziyor (bu da nasıl çalıştığını tam olarak açıklamıyor).
dhag

man findve man sortbrainz :-) kullanın
CeDeROM

MacOS'ta gerçekten çalışmıyor, çünkü boyutu doğru döndüremiyor ve çok sayıda sütun döndürüyor.
sorin

3

En zshbüyük düzenli dosya için:

ls -ld -- **/*(.DOL[1])

(tabii ki ls -ld --herhangi bir komutla değiştirebilirsiniz . GNU lsveya uyumlu kullanıyorsanız, aynı zamanda insan okunabilir boyutları için -hseçeneğe bakın )

  • .: sadece normal dosyalar (dizinler, sembolik bağlantılar, cihazlar, fifos değil ...)
  • D: gizli olanları dahil edin ve gizli direklere inin
  • OL: boyuta göre ters sırada (en L).
  • [1]: sadece ilk eşleşme.

Bağlar varsa, bunlardan herhangi birini rastgele alırsınız. İlki alfabetik sıraya göre dizmek istiyorsanız, bağları alfabetik olarak sıralamak için fazladan on( ame rder) ekleyin .on

Disk kullanımını değil, dosyaların boyutunu dikkate aldığını unutmayın.


... ben zsh'in maaş bordrosunda olduğuna inanmaya başladım;) (hangisi daha iyi olabilir ki?). zsh, maalesef tüm sistemlerde mevcut değil ...
Olivier Dulac

İlk on dosyayı almak mümkün mü? (Bir döngü gibi aptalca bir şey yapmadan)
Wowfunhappy

1
Yerine @Wowfunhappy [1]ile[1,10]
Stéphane Chazelas
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.