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сортировкой по убыванию по количеству содержащихся inode.


1
Это больше похоже на то, что я хочу, чем на принятый ответ.
Шридхар Сарнобат

8

Кажется, самый простой способ find /path/to/search -ls | wc -l

Find используется для обхода всех файлов и папок.
-lsперечислить (распечатать) все имена. Это значение по умолчанию, и если вы его опустите, оно будет работать практически на всех системах. (Почти, так как некоторые могут иметь разные значения по умолчанию). Это - хорошая привычка явно использовать это все же.

Если вы просто используете find /path/to/search -lsчасть, она распечатает все файлы и каталоги на вашем экране.


wcэто количество слов. -lопция говорит это , чтобы подсчитать количество строк.

Вы можете использовать его несколькими способами, например,

  • тестовый файл
  • кошачий тестовый файл | Туалет

Первый вариант позволяет wc открыть файл и подсчитать количество строк, слов и символов в этом файле. Вторая опция делает то же самое, но без имени файла она читает из стандартного ввода.


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

(Другой альтернативой был бы `ls | wc ', но найти гораздо более гибкий и хороший инструмент для изучения.)


[Изменить после комментария]

Возможно, было бы полезно объединить find и 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-alike.
  2. Я подозреваю, что на самом деле вам может понадобиться число файлов для каждого подкаталога.

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

Вместо exec echo вы запускаете поиск | туалет для каждого реж. Я знаю, что это возможно, но я не могу понять, как сегодня. Я думаю, что я продолжаю совершать одну и ту же ошибку. * Собирается варить кофе *.
Хеннес

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, этот ответ даже не дает ответ на ваш собственный вопрос ; или вы не задали вопрос, который имели в виду, когда возникла проблема ... К сожалению, я не могу ее опровергнуть, я должен сказать немного ... все же, плохой ответ!
user1810087

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

2

ncdu отлично подходит для этого!

На странице руководства вы можете также показать количество по каталогам и по порядку:

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

Например:

выход ncdu


1

Используйте тот факт, что каталоги и файлы разделены /. Этот скрипт действительно соответствует вашим критериям, но служит для создания полного решения. Вы также должны рассмотреть возможность индексации ваших файлов с помощью 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

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.