du, який рахує кількість файлів / каталогів, а не розмір


13

Я намагаюся очистити жорсткий диск, на якому накопичені роками всілякі лайно. duдопомогло зменшити використання диска, але все це все ще нелегко не через загальний розмір, а через велику кількість файлів і каталогів загалом.

Чи є спосіб зробити щось на зразок, duале не рахуючи розмір файлу, а кількість файлів і каталогів? Наприклад: файл - 1, а каталог - рекурсивна кількість файлів / каталогів всередині нього + 1.

Редагувати: я повинен був бути більш чітким. Я хотів би знати не тільки загальна кількість файлів / каталогів /, а й /home, і /usrт.д., і в їх підкаталоги, рекурсивно, як duробить для розміру.


2
Подумайте, ви можете шукати щось на зразок дещо зміненої версії відповідей тут superuser.com/questions/198817/…
Джеймс

Відповіді:


11

Я вважаю du --inodesкорисним, але я не впевнений, яка його версія duвимагає. У Ubuntu 17.10 працює наступне:

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

Поєднайте з | sort -nrсортування за спаданням за кількістю містять у них вузлів.


1
Це виглядає набагато більше як те, що я хочу, ніж прийнята відповідь.
Шрідхар Сарнобат

8

Здається, найпростіший спосіб find /path/to/search -ls | wc -l

Find використовується для переходу до всіх файлів і папок.
-lsперелічити (роздрукувати) всі імена. Це за замовчуванням, і якщо ви не залишите його, він все одно буде працювати однаково майже у всіх системах. (Майже, оскільки деякі можуть мати різні за замовчуванням). Хоча явно використовувати це, хоча.

Якщо ви просто використовуєте find /path/to/search -lsчастину, вона надрукує всі файли та каталоги на ваш екран.


wcце кількість слів. -lопція говорить це , щоб підрахувати кількість рядків.

Використовувати його можна кількома способами, наприклад,

  • wc тестовий файл
  • тестовий файл для котів | туалет

Перший варіант дозволяє wc відкрити файл і підрахувати кількість рядків, слів і знаків у цьому файлі. Другий варіант робить те саме, але без імені файлу він читає з stdin.


Ви можете комбінувати команди з трубою |. Вихід з першої команди буде переданий на вхід другої команди. Таким чином, find /path/to/search -ls | wc -lвикористовує find для списку всіх файлів і каталогів і подає вихід на wc. Потім Wc підраховує кількість рядків.

(Іншою альтернативою був би "ls | wc", але пошук набагато гнучкіший і хороший інструмент для навчання.)


[Редагувати після коментаря]

Можливо, буде корисно поєднати знахідку та exec.

Наприклад, find / -type d ! \( -path proc -o -path dev -o -path .snap \) -maxdepth 1 -exec echo starting a find to count to files in in {} \;буде перераховано всі каталоги в /, рядки, які ви не хочете шукати. Ми можемо запустити попередню команду на кожному з них, отримуючи суму файлів у папці в /.

Однак:

  1. Для цього використовується специфічне розширення GNU -maxdepth.
    Він буде працювати на Linux, але не на будь-якому unix-a-подібному.
  2. Я підозрюю, що ви насправді хочете отримати кількість файлів для кожного підкаталу.

Вибачте, не лише один рівень глибокий, але для всіх рівнів (саме це я мав на увазі під "рекурсивним" в моїй редакції).
Джессі

Замість відлуння exec ви запускаєте знахідку | туалет на кожну дір. Я знаю, що це можливо, але, здається, я не знаю, як сьогодні. Я здогадуюсь, я продовжую якось робити одну і ту ж помилку. * Йде варити каву *.
Геннес

4

Наступний скрипт PHP робить свою справу.

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

Помістіть це у файл (скажімо, " treesize"), chmod +xйого і запустіть ./treesize . | sort -rn | less.


Чому це прийнята відповідь ?! Ви припускаєте, що php працює на машині, що не завжди так. Сценарій не задокументований та конкретний. Хоча відповідати на власне запитання щодо SE нормально, ця відповідь навіть не дає відповіді на ваше власне запитання ; або ви не задавали собі питання, яке ви мали на увазі, коли виникала проблема ... На жаль, я не можу це спростувати, я маю декілька пунктів ... все-таки погана відповідь!
користувач1810087

Я не можу писати сценарій будь-якою мовою, не припускаючи, що для цієї мови встановлений перекладач. Сценарій виводить рекурсивно загальну кількість файлів і каталогів під кожен каталог. Тож, duщо просто рахується замість підсумовування розміру, саме це і було задано оригінальним запитанням.
Джессі

2

ncdu чудово підходить для цього!

На сторінці "man" ви можете відобразити рахунки за каталогом і замовити за підрахунками:

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

Наприклад:

ncdu вихід


1

Скористайтеся тим, що dirs та файли розділені між собою /. Цей сценарій дійсно відповідає вашим критеріям, але служить для натхнення повного рішення. Слід також розглянути можливість індексації файлів за допомогою знаходження.

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
Чому я маю .fluxbox в /? : D
Ярослав Рахматуллін

1

Ось рішення, яке використовує bash, натхненний публікацією від Unix & Linux .

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

Якщо є кілька папок, про які ви не хочете бачити деталі, наприклад .git, ви можете виключити їх зі списку grep.

find . -type d |grep -v "./.git/.*" | while read -r dir; do \
    printf "%s:\t" "$dir"; find "$dir" -type f | wc -l; done
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.