Получите точный размер файлов, полученных с помощью команды find.

Этого можно добиться с помощью модуля impstats в rsyslog. Этот модуль обеспечивает периодический вывод внутренних счетчиков rsyslog.

Периодически отображаются сообщения о различных очередях и действиях. Период настраивается. Статистика, выдаваемая импстатами, аналогична другим обычным сообщениям.

Мне не нужно объяснять больше, так как Вы можете получить всю информацию здесь,

http://www.rsyslog.com/doc/v8-stable/configuration/modules/impstats.html

Вот статья владельца rsyslog о том, как его использовать,

http://www.rsyslog.com/how-to-use-impstats/

4
25.09.2019, 20:49
3 ответа

Попробуйте направить вывод findна duи укажите флаг --files0-from -:

find -type f -mtime +60 -print0 | du -shc --files0-from -

Это должно дать вам общую сумму в конце

Чтобы получить только общее количество, направьте этот вывод наtail -n1:

find -type f -mtime +60 -print0 | du -shc --files0-from - | tail -n1

Я должен упомянуть, что на самом деле я только что протестировал это с gnu linux, а не с busybox. Глядя на страницу busybox , не похоже, что duподдерживает опцию --files0-from.

Вы можете изменить приведенную выше команду на это, чтобы она работала на busybox:

find -type f -mtime +60 -print0 | xargs -0 du -ch | tail -n1

Описанное выше также работает с файлами, в именах которых есть пробелы и символы новой строки, но может работать неправильно, если с помощью команды findнайдено слишком много файлов. См. ниже комментарий . Если вы чувствуете, что файлов может быть слишком много, вы можете попробовать другой ответ на этой странице.

4
27.01.2020, 20:49

В принципе, это просто :просто скажите findзапускать duсразу несколько файлов.
find. -type f -mtime +60 -exec du -smc {} +
К сожалению, это не работает надежно, потому что -exec … {} +может выполнять команду несколько раз, она только пытается сгруппировать аргументы и не может сгруппировать все аргументы, если их общая длина превысит ограничение длины командной строки системы. И на самом деле BusyBox find (по крайней мере версия, которую я тестировал только что )вообще не пытается группировать:-exec … {} +обрабатывает один аргумент за раз, строка -exec … {} \;. Невозможно быть уверенным, что получится только одна строка total.

GNU duможно указать читать произвольно длинный список имен файлов с помощью --files0-from, но другие версии du, в частности версия BusyBox, могут брать имена файлов только из командной строки.

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

Если вы можете предположить, что в именах файлов нет символов новой строки, или вы согласны с исключением путей, содержащих символы новой строки, вывод duлегко разобрать :только по одному файлу на строку.

newline='
'
find. ! -path "*${newline}*" -type f -mtime +60 -exec du -k {} + |
awk '{kB += $1} END {printf "%d MB\n", (kB + 512) / 1024}'
3
27.01.2020, 20:49

Если вам нужно кумулятивное использование диска (, поскольку ваше использование duпредполагает )обычных файлов, возраст которых превышает 60 дней и которые нужно только перенести в системы GNU и busybox (хотя обратите внимание, какие команды включены в busybox и какую функцию они поддерживают, настраивается во время сборки, поэтому вы никогда не можете знать, будет ли то, что работает с одним экземпляром busybox, будет работать со следующим ), вы можете сделать:

find. -type f -mtime +59 -print0 |
  xargs -r0 stat -c '%D:%i %b' | awk '
    !seen[$1]++ {sum += $2}
    END {print sum * 512}'

(и да, вам нужно -mtime +59для файлов старше 60 x 24 часов. -mtime +60не будет соответствовать файлу, которому 60,9 дней, поскольку он округлен до 60 дней, а 60 не больше 60 )

Сообщает общее количество байтов. Жесткие ссылки (или другие случаи, такие как привязка -монтирования , где может быть несколько путей к одному и тому же файлу ), учитываются только один раз (, как это делает GNU du;busybox duне делает этого, если жесткие ссылки передаются как отдельные аргументы, а не при обходе одного аргумента каталога ). Однако, как и du, он не будет обнаруживать случаи, когда некоторые данные совместно используются файлами, не -жестко связанными, например, когда файлы были скопированы с помощью cp --reflink=alwaysв файловых системах, таких как btrfs, или когда файловая система выполняет дедупликацию..

Это должно быть эквивалентно специфическому для GNU -:

find. -type f -mtime +59 -print0 |
  du -cB1 --files0-from=- |
  awk 'END{print $1}'

POSIX, и если предположить, что все файлы находятся в одной и той же файловой системе, вы можете сделать:

LC_ALL=C LS_BLOCK_SIZE=512 BLOCKSIZE=512 POSIXLY_CORRECT=1 \
  find. -type f -mtime +59 -exec ls -nisqd {} + | awk '
    !seen[$1]++ {sum += $2}
    END {print sum * 512}'

LS_BLOCK_SIZE=512 BLOCKSIZE=512 POSIXLY_CORRECT=1, чтобы обойти тот факт, что некоторые lsреализации, такие как GNU ls, несовместимы с POSIX по умолчанию. Он не будет работать с busybox ls, который не поддерживает -q. Однако, поскольку он всегда отображает символы новой строки в путях к файлам как ?(, что также не соответствует POSIX ), -qтам не требуется ).

После (здесь в системе GNU):

$ seq 10000 > a
$ truncate -s14T a
$ ln a b
$ touch -d '-60 days' a
$ BLOCKSIZE=1 ls -lis --full-time
total 98304
59944369 49152 -rw-rw-r-- 2 me me 15393162788864 2019-07-29 09:49:25.933 +0100 a
59944369 49152 -rw-rw-r-- 2 me me 15393162788864 2019-07-29 09:49:25.933 +0100 b
$ date --iso-8601=s
2019-09-27T09:50:03+01:00
$ du -h
52K    .

Все дают мне 49152, что представляет собой совокупное использование диска aи b, но отличается от суммы их размера (28 ТиБ )или размера их использования диска (49152 x 2 ).

(обратите внимание, что указанные выше 52 КБ также включают использование диска файлом текущего каталога (., 4 КБ в моем случае )).

По сумме видимых размеров.

find. -type f -mtime +59 -print0 |
  xargs -r0 stat -c %s | awk -v sum=0 '
    {sum += $0}; END{print sum}'

Или с GNUdu:

find. -type f -mtime +59 -print0 |
  du -cbl --files0-from=- |
  awk 'END{print $1}'

Или POSIXly (здесь без ограничения на единую файловую систему):

LC_ALL=C find. -type f -mtime +59 -exec ls -nqd {} + |
  awk -v sum=0 '{sum += $5}; END {print sum}'

В приведенном выше примере все они дают:30786325577728(28 ТиБ ).

2
27.01.2020, 20:49

Теги

Похожие вопросы