9

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

Есть ли способ, которым я могу сделать что-то вроде du но не считая размер файла, а количество файлов и каталогов? Например: файл равен 1, а каталог - это рекурсивное количество файлов / каталогов внутри него + 1.

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

5 ответов5

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

Я нашел 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.

3

Следующий скрипт 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 it и запустите его с ./treesize . | sort -rn | less

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
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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .