it-swarm.com.ru

Получить общий размер списка файлов в UNIX

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

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

По сути, я пытаюсь найти одну строку для переменной 'total_size' в фрагменте кода ниже:

#!/bin/bash
loc_to_look='/foo/bar/location'

file_list=$(find $loc_to_look -type f -name "*.dat" -size +100M)

total_size=???

echo 'total size of all files is: '$total_size

for file in $file_list; do
         # do a bunch of operations
done
22
HotDogCannon

Вы должны просто иметь возможность передавать $file_list в du:

du -ch $file_list | tail -1 | cut -f 1

Варианты du:

  • -c отображать итог
  • -h читаемый человеком (то есть 17M)

du напечатает запись для каждого файла, за которой следует итоговое значение (с -c), поэтому мы используем tail -1 для обрезки только до последней строки и cut -f 1 для обрезки этой строки только до первого столбца.

36
sanmiguel

Методы, описанные здесь, имеют скрытую ошибку. Если список файлов длинный, то он превышает лимит размера команды Shell. Лучше использовать этот, используя du:

find <some_directories> <filters> -print0 | du <options> --files0-from=- --total -s|tail -1

find выдает список файлов с нулевым окончанием, du берет его из stdin и рассчитывает . Это не зависит от ограничения размера команды Shell . Конечно, вы можете добавить некоторые переключатели du ​​для получения логического размера файла, потому что по умолчанию du рассказал вам, сколько физического места займет файл.

Но я думаю, что это не вопрос для программистов, а для администраторов Unix :), тогда для stackoverflow это не в тему.

17
Znik

Этот код складывает все байты из верного ls для всех файлов (он исключает все каталоги ... очевидно, они 8 КБ на папку/каталог)

cd /; find -type f -exec ls -s \; | awk '{sum+=$1;} END {print sum/1000;}'

Примечание: Выполнить от имени пользователя root. Результат в мегабайтах.

2
Alex Konrad Keßler

ls -l | tr -s ' ' | cut -d ' ' -f <field number> - это то, чем я часто пользуюсь. 

5-е поле - это размер. Поместите эту команду в цикл for и добавьте размер к аккумулятору, и вы получите общий размер всех файлов в каталоге. Проще, чем учиться AWK. Кроме того, в части подстановки команд вы можете использовать grep для ограничения того, что вы ищете (^ - для файлов и т.д.).

total=0

for size in $(ls -l | tr -s ' ' | cut -d ' ' -f 5) ; do
  total=$(( ${total} + ${size} ))
done

echo ${total}
0
Richard