Вычислить общее используемое дисковое пространство файлами старше 180 дней, используя find

Я пытаюсь найти общее пространство на диске, используемое файлами старше 180 дней в определенном каталоге. Это то, что я использую:

    find . -mtime +180 -exec du -sh {} \;

но вышеупомянутое тихо, очевидно, дает мне дисковое пространство, используемое каждым найденным файлом. Я хочу только общее добавленное дисковое пространство, используемое файлами. Можно ли это сделать с помощью команд find и exec?

Обратите внимание: я просто не хочу использовать script для этого, это будет здорово, если для этого может быть один лайнер. Любая помощь высоко ценится.

Ответы

Ответ 1

@PeterT является правильным. Почти все эти ответы вызывают команду (du) для каждого файла, которая очень ресурсоемкая и медленная и ненужная. Самый простой и быстрый способ:

find . -type f -mtime +356 -printf '%s\n' | awk '{total=total+$1}END{print total/1024}'

Ответ 2

du не суммируется, если вы передадите ему список файлов.

Вместо этого выведите вывод на cut и awk подведите итог. Поэтому вы можете сказать:

find . -mtime +180 -exec du -ks {} \; | cut -f1 | awk '{total=total+$1}END{print total/1024}'

Обратите внимание, что опция -h для отображения результата в человеко-читаемом формате была заменена на -k, что эквивалентно размеру блока 1K. Результат представлен в MB (см. total/1024 выше).

Ответ 3

Почему не это?

find /path/to/search/in -mtime +180 -print0 | du -hc --files0-from - | tail -n 1

Ответ 4

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

Например, у меня много файлов в каталоге ~/tmp:

$ du -sh ~/tmp
3,7G    /home/rpet/tmp

Запустив первую часть примера, отправленную devnull, чтобы найти файлы, измененные за последние 24 часа, мы видим, что awk суммирует весь использование диска в каталоге ~/tmp:

$ find ~/tmp -mtime 0 -exec du -ks {} \; | cut -f1
3849848
84
80

Но есть только один файл, измененный за этот период времени, при очень небольшом использовании диска:

$ find ~/tmp -mtime 0
/home/rpet/tmp
/home/rpet/tmp/kk
/home/rpet/tmp/kk/test.png

$ du -sh ~/tmp/kk
84K /home/rpet/tmp/kk

Поэтому нам нужно учитывать только файлы и исключать каталоги:

$ find ~/tmp -type f -mtime 0 -exec du -ks {} \; | cut -f1 | awk '{total=total+$1}END{print total/1024}'
0.078125

Вы также можете указать диапазоны дат, используя параметр -newermt. Например:

$ find . -type f -newermt "2014-01-01" ! -newermt "2014-06-01"

См. http://www.commandlinefu.com/commands/view/8721/find-files-in-a-date-range

Ответ 5

Вы можете распечатать размер файла с помощью find с помощью параметра -printf, но вам все равно нужно awk суммировать.

Например, общий размер всех файлов старше 365 дней:

find . -type f -mtime +356 -printf '%s\n' \
     | awk '{a+=$1;} END {printf "%.1f GB\n", a/2**30;}'