du, który liczy liczbę plików / katalogów, a nie ich rozmiar

13

Usiłuję oczyścić dysk twardy, na którym gromadzą się różnego rodzaju bzdury gromadzone przez lata. dupomógł zmniejszyć zużycie dysku, ale całość nie jest często dziwnie nie ze względu na całkowity rozmiar, ale ze względu na całkowitą liczbę plików i katalogów ogółem.

Czy istnieje sposób, aby zrobić coś takiego, duale nie zliczać rozmiaru pliku, ale raczej liczbę plików i katalogów? Na przykład: plik ma wartość 1, a katalog to rekursywna liczba plików / katalogów w nim + 1.

Edycja: Powinienem był być bardziej jasny. Chciałbym nie tylko poznać całkowitą liczbę plików / katalogów /, ale również /home, /usretc, a ich podkatalogów rekurencyjnie, jak durobi dla wielkości.

Jesse
źródło
2
Myślisz, że szukasz czegoś w rodzaju nieco zmodyfikowanej wersji odpowiedzi tutaj superuser.com/questions/198817/…
James

Odpowiedzi:

11

Uznałem, że jest du --inodesprzydatny, ale nie jestem pewien, która wersja dutego wymaga. W systemie Ubuntu 17.10 działa:

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

Połącz z, | sort -nraby posortować malejąco według liczby i-węzłów zawierających.

krlmlr
źródło
1
To wygląda bardziej jak to, czego chcę, niż zaakceptowana odpowiedź.
Sridhar Sarnobat
8

Wydaje się, że najłatwiejszym sposobem find /path/to/search -ls | wc -l

Znajdź służy do przechodzenia przez wszystkie pliki i foldery.
-lswyświetlić (wydrukować) wszystkie nazwiska. Jest to ustawienie domyślne i jeśli go nie uwzględnisz, nadal będzie działać tak samo prawie we wszystkich systemach. (Prawie, ponieważ niektóre mogą mieć inne ustawienia domyślne). Dobrym nawykiem jest jednak jawne używanie tego.

Jeśli tylko użyjesz tej find /path/to/search -lsczęści, wydrukuje ona wszystkie pliki i katalogi na ekranie.


wcto liczba słów. -lopcja informuje go policzyć liczbę wierszy.

Możesz go używać na kilka sposobów, np

  • plik testowy wc
  • plik testowy kota | toaleta

Pierwsza opcja pozwala wc otworzyć plik i policzyć liczbę wierszy, słów i znaków w tym pliku. Druga opcja robi to samo, ale bez nazwy pliku czyta ze standardowego wejścia.


Możesz łączyć polecenia za pomocą potoku |. Dane wyjściowe z pierwszego polecenia będą przesyłane potokowo do danych wejściowych drugiego polecenia. Dlatego find /path/to/search -ls | wc -lużywa find do wyświetlenia wszystkich plików i katalogu i podaje dane wyjściowe do wc. Wc następnie zlicza liczbę linii.

(Inną alternatywą byłoby `ls | wc ', ale find jest znacznie bardziej elastyczny i jest dobrym narzędziem do nauki.)


[Edytuj po komentarzu]

Przydatne może być połączenie find i exec.

Np. Wyświetli find / -type d ! \( -path proc -o -path dev -o -path .snap \) -maxdepth 1 -exec echo starting a find to count to files in in {} \;listę wszystkich katalogów w /, zablokuje niektóre, których nie chcesz przeszukiwać. Możemy wywołać poprzednie polecenie na każdym z nich, uzyskując sumę plików na folder w /.

Jednak:

  1. Używa to rozszerzenia specyficznego dla GNU -maxdepth.
    Będzie działał na Linuksie, ale nie tylko na każdym systemie uniksowym.
  2. Podejrzewam, że możesz chcieć mieć pewną liczbę plików dla każdego podkatalogu.
Hennes
źródło
Niestety, nie tylko jeden poziom głębokości, ale dla wszystkich poziomów (to miałem na myśli przez słowo „rekurencyjnie” w mojej edycji).
Jesse
Zamiast echa exec uruchamiasz wyszukiwanie | wc dla każdego reż. Wiem, że to możliwe, ale wydaje mi się, że nie mogę odkryć, jak dziś. Chyba wciąż popełniam ten sam błąd. * Idzie do parzenia kawy *.
Hennes
4

Poniższy skrypt PHP załatwia sprawę.

#!/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']);
}

Umieść to w pliku (powiedz „ treesize”), chmod +xa następnie uruchom ./treesize . | sort -rn | less.

Jesse
źródło
Dlaczego jest to akceptowana odpowiedź ?! Zakładasz, że php jest na maszynie, co nie zawsze tak jest. Skrypt nie jest udokumentowany i nie jest ściśle określony. Chociaż można odpowiedzieć na własne pytanie w SE, odpowiedź ta nawet nie zawiera odpowiedzi na twoje własne pytanie ; lub nie zadałeś pytania, które miałeś na myśli, kiedy pojawił się problem ... Niestety nie mogę głosować za nim, muszę do kilku punktów ... nadal, zła odpowiedź!
user1810087,
Nie mogę napisać skryptu w żadnym języku bez założenia tłumacza dla tego języka. Skrypt rekurencyjnie wypisuje całkowitą liczbę plików i katalogów pod każdym katalogiem. A więc duliczy się po prostu zamiast sumowania rozmiaru, co jest dokładnie tym, jakie zadano w pierwotnym pytaniu.
Jesse
2

ncdu jest do tego świetny!

Na stronie podręcznika możesz wyświetlać liczby według katalogu i sortować według liczby:

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

Na przykład:

wyjście ncdu

osoby poszukujące pracy
źródło
1

Wykorzystaj fakt, że katalogi i pliki są oddzielone /. Ten skrypt spełnia Twoje kryteria, ale służy do zainspirowania pełnego rozwiązania. Powinieneś także rozważyć zaindeksowanie plików za pomocą locate.

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
Ярослав Рахматуллин
źródło
2
Dlaczego mam .fluxbox w /? : D
Ярослав Рахматуллин
1

Oto rozwiązanie wykorzystujące bash, zainspirowane postem z Unixa i Linuksa .

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

Jeśli są jakieś foldery, których szczegóły nie chcesz zobaczyć .git, możesz na przykład wykluczyć je z listy grep.

find . -type d |grep -v "./.git/.*" | while read -r dir; do \
    printf "%s:\t" "$dir"; find "$dir" -type f | wc -l; done
Don Kirkby
źródło