Вычислить общее используемое дисковое пространство файлами старше 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;}'