du boyutu yerine dosya / dizin sayısını sayar


13

Yıllar boyunca biriken her türlü boktan bir sabit diski temizlemeye çalışıyorum. dudisk kullanımını azaltmaya yardımcı oldu, ancak her şey hala toplam boyuttan değil, toplam dosya ve dizin sayısından kaynaklanıyor.

Ben dudosya boyutu sayma değil, daha çok dosya ve dizin sayısı gibi bir şey yapabilirim bir yolu var mı ? Örneğin: bir dosya 1'dir ve bir dizin, içindeki + 1 özyinelemeli dosya / dizin sayısıdır.

Düzenleme: Daha açık olmalıydım. Sadece boyutu için olduğu gibi , sadece , /içinde /home, /usrvb, ve alt dizinlerinde toplam dosya / dizin sayısını bilmek istiyorum du.


2
Buradaki cevapların biraz değiştirilmiş bir versiyonu gibi olabileceğinizi düşünün superuser.com/questions/198817/…
James

Yanıtlar:


11

du --inodesYararlı buldum , ancak hangi sürümünün dugerektirdiğinden emin değilim . Ubuntu 17.10'da aşağıdakiler çalışır:

du --inodes      # all files and subdirectories
du --inodes -s   # summary
du --inodes -d 2 # depth 2 at most

| sort -nrİçeren inode sayısına göre azalanları sıralamak için ile birleştirin .


1
Bu, kabul ettiğim cevaptan çok istediğim gibi görünüyor.
Sridhar Sarnobat

8

En kolay yol find /path/to/search -ls | wc -l

Bul tüm dosyalar ve klasörler üzerinden yürümek için kullanılır.
-lsTüm isimleri listelemek (yazdırmak). Bu bir varsayılan ayardır ve dışarıda bırakırsanız hemen hemen tüm sistemlerde aynı şekilde çalışır. (Neredeyse, bazıları farklı varsayılanlara sahip olabileceğinden). Yine de bunu açıkça kullanmak iyi bir alışkanlıktır.

Sadece find /path/to/search -lsparçayı kullanırsanız, tüm dosyaları ve dizinleri ekranınıza yazdıracaktır.


wckelime sayımıdır. -lopsiyon satır sayısını saymak için söyler.

Birkaç şekilde kullanabilirsiniz, örn.

  • wc test dosyası
  • kedi test dosyası | tuvalet

İlk seçenek, wc'nin bir dosyayı açmasına ve o dosyadaki satır, kelime ve karakter sayısını saymasına izin verir. İkinci seçenek de aynısını yapar ancak dosya adı olmadan stdin'den okur.


Bir boru ile komutları kombine edebilirsiniz |. İlk komuttan çıkış ikinci komutun girişine bağlanır. Böylece find /path/to/search -ls | wc -lfind tüm dosyaları ve dizini listeler ve çıktı wc besler. Wc daha sonra satır sayısını sayar.

(Başka bir alternatif `` ls | wc '' olurdu, ancak bulmak çok daha esnek ve öğrenmek için iyi bir araçtır.)


[Yorumdan sonra düzenle]

Bulma ve yürütmeyi birleştirmek yararlı olabilir.

Örneğin find / -type d ! \( -path proc -o -path dev -o -path .snap \) -maxdepth 1 -exec echo starting a find to count to files in in {} \;, arama yapmak istemediğiniz bazı dizinleri /, çubuğunda listeleyecektir. Her birinde bir önceki komutu tetikleyebiliriz ve / içindeki klasör başına toplam dosya veririz.

Ancak:

  1. Bu, GNU'ya özgü -maxdepth uzantısını kullanır.
    Linux üzerinde çalışacak, ancak herhangi bir unix-a-benzeri üzerinde değil.
  2. Aslında her bir alt dizin için bir dizi fo dosya isteyebileceğinden şüpheleniyorum.

Üzgünüm, sadece bir seviye derin değil, ama tüm seviyeler için (benim düzenlememde "özyinelemeli" ile kastettiğim budur).
Jesse

Exec yankı yerine bir bulmayı tetikler | her yön için wc. Bunun mümkün olduğunu biliyorum, ama bugün nasıl olduğunu keşfedemiyorum. Sanırım aynı hatayı bir şekilde yapmaya devam ediyorum. * Kahve demlemeye gider *.
Hennes

4

Aşağıdaki PHP betiği hile yapar.

#!/usr/bin/php
<?php 

function do_scan($dir, $dev) {
  $total = 1;

  if (\filetype($dir) === 'dir' && \lstat($dir)['dev'] == $dev) {
    foreach (\scandir($dir) as $file) {
      if ($file !== '.' && $file !== '..') {
        $total += do_scan($dir . \DIRECTORY_SEPARATOR . $file, $dev);
      }
    }

    print "$total\t$dir\n";
  }

  return $total;
};

foreach (\array_slice($argv, 1) as $arg) {
  do_scan($arg, \lstat($arg)['dev']);
}

Bunu bir dosyaya koyun (diyelim " treesize") chmod +xve çalıştırın ./treesize . | sort -rn | less.


Bu neden kabul edilen cevap ?! Php makinede olduğunu varsayıyoruz, her zaman böyle değildir. Komut dosyası belgelenmemiş ve belirli bir dosyaya ait değil. SE ile ilgili kendi sorunuzu cevaplamanız uygun olsa da, bu cevap kendi sorunuza bir cevap bile vermez ; ya da sorun ortaya çıktığında aklınıza takılan soruyu sormadınız ... Maalesef bunu küçümseyemiyorum, birkaç noktaya ihtiyacım var ... yine de, kötü cevap!
user1810087

Bu dil için bir tercüman yüklendiğini varsaymadan komut dosyasını herhangi bir dilde yazamıyorum . Komut dosyası, her dizinin altındaki toplam dosya ve dizin sayısını özyineli olarak yazdırır. Yani , asıl sorunun sorduğudu boyutun toplanması yerine basitçe sayılır .
Jesse

2

ncdu bunun için harika!

Man sayfasından, her dizinde sayıları ve sıraları sayar olarak gösterebilirsiniz:

[...]
KEYS
       C   Order by number of items (press again for descending order)
[...]
       c   Toggle display of child item counts.

Örneğin:

ncdu çıkışı


1

Dizin ve dosyaların birbirinden ayrıldığı gerçeğini kullanın /. Bu komut dosyası kriterlerinizi sıcak karşılar, ancak tam bir çözüme ilham verir. Ayrıca dosyalarınızı locate ile indekslemeyi de düşünmelisiniz.

geee: /R/tb/tmp
$ find  2>/dev/null | awk -F/ -f filez  | sort -n
files:  57
3       imagemagick
7       portage
10      colemak-1.0
25      minpro.com
42      monolith
80      QuadTree
117     themh
139     skyrim.stings
185     security-howto
292     ~t
329     skyrim
545     HISTORY
705     minpro.com-original
1499    transmission-2.77
23539   ugent-settings

>

$ cat filez
{
a[$2]++;     # $1= folder,  $2 = everything inside folder.
}

END {
        for (i in a) {
                if (a[i]==1) {files++;}
                else { printf "%d\t%s\n", a[i], i; }
        }
        print "files:\t" files
}

>

 $ time locate /  | awk -F/ -f /R/tb/tmp/filez  | sort -n
 files:  13
 2
 2       .fluxbox
 10      M
 11      BIN
 120     bin
 216     sbin
 234     boot
 374     R
 854     dev
 1351    lib
 2018    etc
 9274    media
 30321   opt
 56516   home
 93625   var
 222821  usr
 351367  mnt
 time: Real 0m17.4s  User 0m4.1s  System 0m3.1s

2
Neden .fluxbox içinde / var? : D
Ярослав Рахматуллин

1

İşte Unix ve Linux'tan bir gönderiden esinlenerek bash kullanan bir çözüm .

find . -type d | while read -r dir; do \
    printf "%s:\t" "$dir"; find "$dir" -type f | wc -l; done

Ayrıntılarını görmek istemediğiniz bazı klasörler .gitvarsa, bunları listeden hariç tutabilirsiniz grep.

find . -type d |grep -v "./.git/.*" | while read -r dir; do \
    printf "%s:\t" "$dir"; find "$dir" -type f | wc -l; done
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.