Получить общий размер списка файлов в UNIX
Я хочу запустить команду find
, которая найдет определенный список файлов, а затем повторит этот список файлов для выполнения некоторых операций. Я также хочу найти общий размер всех файлов в этом списке.
Я хочу сделать список файлов FIRST, а затем выполнить другие операции. Есть ли простой способ сообщить только общий размер всех файлов в списке?
В сущности, я пытаюсь найти однострочный для переменной 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
Ответы
Ответ 1
Вы должны просто передать $file_list
в du
:
du -ch $file_list | tail -1 | cut -f 1
du
опции:
-
-c
отображает общее количество
-
-h
читаемый человеком (т.е. 17M)
du
будет печатать запись для каждого файла, затем общая (с -c
), поэтому мы используем tail -1
для обрезки только для последней строки и cut -f 1
, чтобы обрезать эту строку только на первую столбец.
Ответ 2
Методы, описанные здесь, имеют скрытую ошибку. Когда список файлов длинный, он превышает предел размера командной строки. Лучше используйте это, используя du:
find <some_directories> <filters> -print0 | du <options> --files0-from=- --total -s|tail -1
find производит нулевой список файлов, du берет его из stdin и counts.
это не зависит от ограничения размера командной строки.
Конечно, вы можете добавить несколько переключателей, чтобы получить размер логического файла, потому что по умолчанию du рассказал вам, как много физических файлов пространства будет принимать.
Но я думаю, что это не вопрос для программистов, а для администраторов unix:), то для stackoverflow это не в тему.
Ответ 3
Этот код суммирует все байты из надежных ls для всех файлов (он исключает все каталоги... видимо, они являются 8kb в папке/каталоге)
cd /; find -type f -exec ls -s \; | awk '{sum+=$1;} END {print sum/1000;}'
Примечание. Выполните команду root. Результат в мегабайтах.
Ответ 4
ls -l | tr -s '' | cut -d '' -f - это то, что я использую много.
Пятое поле - это размер. Поместите эту команду в цикл for и добавьте размер в накопитель, и вы получите общий размер всех файлов в каталоге. Легче, что обучение AWK. Плюс в части замены команды, вы можете grep ограничить то, что вы ищете (^ - для файлов и т.д.).
Общий = 0
для размера в $(ls -l | tr -s '' | cut -d '' -f 5); do total = $(($ {total} + ${size})); сделано
echo ${total}