общий размер группы файлов, выбранных с помощью команды «найти» - PullRequest
41 голосов
/ 16 июля 2009

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

find /rapidly_shrinking_drive/ -type f -mtime -1 -ls | less

И я нахожу, ну, много вещей. Тысячи файлов шести-семи типов. Я могу выделить тип и сосчитать их:

find /rapidly_shrinking_drive/ -name "*offender1*" -mtime -1 -ls | wc -l

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

find /rapidly_shrinking_drive/ -name "*offender1*" -mtime -1 | howmuchspace

Я открыт для однострочного Perl для этого, если у кого-то есть, но я не собираюсь использовать какое-либо решение, включающее многострочный скрипт, или File :: Find.

Ответы [ 6 ]

63 голосов
/ 16 июля 2009

Команда du сообщает вам об использовании диска. Пример использования для вашего конкретного случая:

find rapidly_shrinking_drive/ -name "offender1" -mtime -1 -print0 | du --files0-from=- -hc | tail -n1

(Ранее я писал du -hs, но на моей машине это игнорирует ввод find и суммирует размер cwd.)

14 голосов
/ 16 июля 2009

Черт, Stephan202 прав. Я не думал о du-s (суммировать), поэтому вместо этого я использовал awk:

find rapidly_shrinking_drive/ -name "offender1" -mtime -1 | du | awk '{total+=$1} END{print total}'

Мне больше нравится другой ответ, и он почти наверняка более эффективен.

7 голосов
/ 16 июля 2009

с GNU find,

 find /path -name "offender" -printf "%s\n" | awk '{t+=$1}END{print t}'
3 голосов
/ 02 февраля 2013

Я бы хотел перевести комментарий Джейсона выше в статус ответа, потому что я считаю, что он самый мнемонический (хотя и не самый общий, если вам действительно нужен список файлов, заданный find):

$ du -hs *.nc
6.1M  foo.nc
280K  foo_region_N2O.nc
8.0K  foo_region_PS.nc
844K  foo_region_xyz.nc
844K  foo_region_z.nc
37M   ETOPO1_Ice_g_gmt4.grd_region_zS.nc
$ du -ch *.nc | tail -n 1
45M total
$ du -cb *.nc | tail -n 1
47033368  total
1 голос
/ 08 января 2011

Я попробовал все эти команды, но не повезло. Итак, я нашел этот, который дает мне ответ:

find . -type f -mtime -30 -exec ls -l {} \; | awk '{ s+=$5 } END { print s }'
0 голосов
/ 16 июля 2009

Вы также можете использовать ls -l чтобы найти их размер, затем awk, чтобы извлечь размер:

find /rapidly_shrinking_drive/ -name "offender1" -mtime -1 | ls -l | awk '{print $5}' | sum
...