Подтвердить что ты не робот

Рассчитать размер файлов в оболочке

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

find -name *.undo -exec stat -c% s {} \; | awk '{total + = $1} END {print total}'

Есть ли более простой способ сделать это? Я чувствую, что должен быть простой переключатель du или find, который делает это для меня, но я не могу его найти.

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

du -bs *.undo

не будет работать, потому что он соответствует только файлам в текущем каталоге.

4b9b3361

Ответ 1

Try:

find . -name "*.undo" -ls | awk '{total += $7} END {print total}'

В моей системе размер файла - это седьмое поле в выводе find -ls. Если ваш вывод find … -ls отличается, отрегулируйте.

В этой версии использование существующей информации о директории (размер файла) и встроенной функции поиска find должно быть эффективным, избегая создания процессов или ввода/вывода файлов.

Ответ 2

С помощью zsh вы можете использовать расширенное globbing:

du -c **/*. undo

Ответ 3

find -name *.undo -print0 | du -hc --files0-from=-

Ответ 4

du -c *pattern*

Это будет печатать итоговые данные на последней строке вывода.

Ответ 5

Я тоже рассматривал эту проблему (только через год...) - только что нашел эту страницу.

Что-то, что я нашел, работает (для меня):

find /mnt/iso -name *.avi -printf "%s\n" | paste -sd+ - | bc

Это вернет общий размер всех файлов .avi во всех подпапках ниже /mnt/iso

Я должен отдать должное radoulov за команду paste - см. эту страницу: Команда оболочки для суммирования целых чисел, по одной в строке?

Просто добавьте - на всякий случай, если папка соответствует поисковому запросу - неплохо также использовать -type f в команде find.

Ответ 6

find -name '*.undo' -exec wc -c {} + | tail -n 1

должно указывать фактическое общее количество байтов в файлах, если у вас слишком много файлов (где "слишком много" будет действительно большим числом, возможно, в тысячах). Или, если вы просто хотите получить номер один,

find -name '*.undo' -exec wc -c {} + | tail -n 1 | cut -d' ' -f 1

Ответ 7

Python является частью большинства дистрибутивов Linux.

import os
import fnmatch
size= 0
for path, dirs, files in os.walk( '.' ):
    for f in files:
        if fnmatch.fnmatch(f,'*.py'):
            fileSize= os.path.getsize( os.path.join(path,f) ) 
            print f, fileSize
            size += fileSize
print size

Долгая, но совершенно прозрачная и очень расширяемая.

Ответ 8

find -name '*.undo' -print0 | du -hc --files0-from=- | tail -n 1

Объединитесь из gerdemb и вкладов стражника. Использование du -cb должно отображать байты.

Ответ 9

Я использую команду du, чтобы получить только номер:

du file_list | awk '{s+=$1} END {print s}'

Ответ 10

Как насчет этого простого.

find ./ -name *.undo | xargs wc

Ответ 11

Или вы можете просто сделать это:

dir=$1

for file in $dir/* ; do

 length_file=`stat -c %s $file`
 echo "File $file has length $length_file"
 length_total=`expr $length_total + $length_file`

done

echo "Total length: $length_total ."

Где stat отображает статус файла или файловой системы. Аргумент -c означает использование указанного формата вместо значения по умолчанию, а последовательность форматирования $s позволяет отображать общий размер байтов.

expr 

Просто оценивает выражение.

Ответ 12

Perl однострочный:

find . -name "*.undo" -ls | perl -lane '$t += $F[6]; END{print $t}'

Массив autosplit @F начинается с индекса $F[0], тогда как awk-поля начинаются с $1, поэтому $F[6] используется вместо awk $7

Ответ 13

du -c | awk '/./{line=$0} END {print $1}'

Ответ 14

Я думаю, что версия с xargs может быть расширена (упрощена) ls -1 *.undo | xargs wc

Ответ 15

Проверьте du (использование диска).