Этого можно добиться с помощью модуля impstats в rsyslog. Этот модуль обеспечивает периодический вывод внутренних счетчиков rsyslog.
Периодически отображаются сообщения о различных очередях и действиях. Период настраивается. Статистика, выдаваемая импстатами, аналогична другим обычным сообщениям.
Мне не нужно объяснять больше, так как Вы можете получить всю информацию здесь,
http://www.rsyslog.com/doc/v8-stable/configuration/modules/impstats.html
Вот статья владельца rsyslog о том, как его использовать,
Попробуйте направить вывод 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
найдено слишком много файлов. См. ниже комментарий . Если вы чувствуете, что файлов может быть слишком много, вы можете попробовать другой ответ на этой странице.
В принципе, это просто :просто скажите 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}'
Если вам нужно кумулятивное использование диска (, поскольку ваше использование 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 ТиБ ).