Dosyaları nasıl bulurum ve toplam boyutları nasıl olur?


12

Bir dizi dosya (joker karakter ifadesine dayalı olarak) bulmak ve disk kullanımını toplamak istiyorum.

Bunun gibi bir şey:

$ find . -name 'flibble*' -ctime +90 -exec du -sh {} \;

2.1G    ./flibble_116.log
2.1G    ./flibble_83.log
2.1G    ./flibble_211040_157.log
2.1G    ./flibble3747_51.log

Bu iş. Ama aradığım sonucu vermiyor. Her dosya tarafından kullanılan alanı, findbunların arasında yinelendiği gibi listeler .

Ne istiyorum bulunan dutüm dosyaların toplamıdır .

Yanıtlar:


12

Çözüm

-c(Veya --total) seçeneğini sağlayarak, du(1)genel bir toplam üretmesi talimatını verebilirsiniz. Uygulamanız du(1)bu seçeneklerden birini destekliyorsa, aşağıdaki komutu kullanarak istediğiniz efekti elde edebilirsiniz:

$ find . -name 'flibble*' -ctime +90 -exec du -shc {} +

DÜZENLEME: Dosya sayısı sisteminizin izin verdiği maksimum parametre sayısını aşarsa findyine de commandbirden çok kez yürütülebileceğini unutmayın . Bazı uygulamaları du(1), belirtilen sınırlamadan muzdarip olmayan bir dosyadan dosya adlarının okunmasını da destekler:

$ find -name 'flibble*' -ctime +90 -print0 > filenames
$ du -shc --files0-from=filenames

açıklama

Semantik arasındaki fark -exec command {} \;ve -exec command {} +şu şekildedir:

  • command {} \;commandher sonucu için bir kez yürütür find. Sonucun yerine yol adı iletilir {}.

    $ touch 1 2 3
    $ find  1 2 3 -maxdepth 0 -exec echo {} \;
    1
    2
    3
  • command {} +commandtüm sonuçlar alındığında yürütür . Sonuçların yol adları yerine geçilir {}.

    $ touch 1 2 3
    $ find  1 2 3 -maxdepth 0 -exec echo {} +
    1 2 3

-print0Seçenek neden find(1)standart çıktı null karakteri ile ayrılmış bulunan dosya yazdırmak için, ve --files0-fromopsiyon neden du(1)boş ayrılmış dosya adlarını okumak için. Yeni satır karakterinden farklı olarak, null karakter bir dosya adında görünmeyebilir, bu nedenle çıktı kesin değildir.

Ait seçenekleri hakkında daha fazla bilgi edinmek için du(1)ve find(1)istediğinizde, ilgili klavuz sayfalarını danışmalısınız:

$ man du
$ man find

2
Komut satırı bağımsız değişkenlerinin sayısı sınırlaması nedeniyle dosya sayısı önemliyse (1K +) birden çok toplamla karşılaşabilirsiniz.
ychaouche

@Ychaouche onaylayabilirim, 30k'dan fazla dosyanın boyutunu değerlendirmeye çalışırken sorunu aldım.
Adrien H

Bu bir sorun varsa, bazı uygulamaları du(1)da bir dosyadan dosya adlarını okuyarak desteklemektedir: find 1 2 3 -maxdepth 0 -print0 > filenames; du -shc --files0-from=filenames.
Witiko

4

Bunu dene:

du -c `find . -name 'flibble*' -ctime +90` | tail -1

Orijinal komut du argümanını verir, sonra tüm argümanları geçene kadar yürütür. Bu şekilde, tüm argümanları bir kerede veriyorsunuz, sonra ayrı boyutları kesiyor ve sadece toplamı bırakıyorsunuz. İsterseniz her dosyanın boyutunu göstermek için boruyu ve kuyruğu kaldırabilirsiniz.


Bu, boşluk içeren yol adları ile doğru sonuçlar üretmez. Bunu yapmanın doğru yolu , yol adlarını değiştirilmemiş olarak geçirecek -exec du -c {} +seçeneğini kullanmaktır . finddu
Witiko

4

Bunu deneyebilirsiniz:

find . -name 'flibble*' -ctime +90 -exec du -ch {} + | grep total

2

findKendisi boyutunu yazdırmak ve toplam hesaplamak için başka bir araç kullanmak olurdu :

find . -name 'flibble*' -ctime +90 -printf "%s\n" |
perl -lnE '$sum += $_} END {say $sum'

Dosya adlarını da görmek istiyorsanız:

find . -name 'flibble*' -ctime +90 -printf "%s\t%p\n" |
perl -apE '$sum += $F[0]} END {say $sum'

1

Çoğu sistemde Gigabyte toplamı elde etmek için çalışması gereken bir astar:

echo "$(( ($(find . -name 'flibble*' -ctime +90 -type f -printf '%k+' )0)/1024/1024 )) GB"
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.