Вы можете загрузиться с модулем radeon в черный список, а затем загрузить его в rc.local (modprobe radeon). Это сделало мою систему стабильной.
TL; DR: ls и awk не нужны для вашей цели. Используйте du -cb или du -bs в каталоге, который вы хотите проанализировать.
Ваша цель состоит в
Найти все файлы, чтобы найти их размер (в байтах), произвести общую сумму для всех из нихВсе эти действия могут выполняться с помощью [ f8].
$ du -bs $HOME 2>/dev/null
76709521942 /home/xieerqi
Стоит заметить, что du имеет два «режима» - он может либо показать, сколько файлов имеет размер, либо сколько фактического дискового пространства он занимает (реальная, физическая недвижимость ). Поскольку вас интересует общий размер всех файлов, вам нужен размер файла. Флаг -b дает именно то, что [-b является псевдонимом для --apparent-size --block-size=1).
Возможно, еще более кратким и подходящим решением было бы использовать du -bc непосредственно в каталоге, который вы хотите. Например, мой домашний каталог имеет размер около 76 ГБ
$ du -bc $HOME 2> /dev/null | tail -1
76694582570 total
По какой-то причине вы беспокоитесь о различии в размере папки и размере файла. Вы сказали в комментариях:
I предпочитает ls, так как размеры директорий меняются, а размеры файлов постоянны.du является рекурсивным и суммирует размеры файлов. Кроме того, каталог имеет статический размер 4096 байт (4k), но с du он будет включен в результат du -bs directory_name. Рассмотрим это:
$ du -b suse/openSUSE-Leap-42.1-DVD-x86_64.iso
4648337408 suse/openSUSE-Leap-42.1-DVD-x86_64.iso
$ du -b suse/
4648341504 suse/
$ bc <<< "4648337408+4096"
4648341504
$ mkdir suse/another_dir
$ du -b suse/another_dir
4096 suse/another_dir
$ du -bs suse/
4648345600 suse/
Под капотом awk выполняет все вычисления с использованием чисел с плавающей запятой с двойной точностью. По умолчанию он печатает их с помощью спецификатора формата printf(3) %.6g, а это означает, что если число больше шестизначных чисел, оно переключится на E-нотацию, что вы видели. Вы можете обойти это, установив переменную OFMT:
ls -lR |
awk 'BEGIN { OFMT = "%d" }
/^-/ { total += $5 }
END { print "Total:", total }'
Но есть верхний предел, за которым он не может дать вам точное количество байтов; он начнет округлять низкие биты суммы. 500 гигабайт = 500 * 1024 * 1024 * 1024 = 536870912000 & approx; 239. С обычной плавающей точкой IEEE это безопасно ниже этого предела (что примерно равно 252). Тем не менее, он достаточно велик, что я лично почувствовал бы себя лучше, используя язык программирования, который имел бы правильные «бонусы» (неограниченные целые числа). Например, Python:
#! /usr/bin/python
import os
import sys
space = 0L # L means "long" - not necessary in Python 3
for subdir, dirs, files in os.walk(sys.argv[1]):
for f in files:
space += os.lstat(os.path.join(subdir, f)).st_size
sys.stdout.write("Total: {:d}\n".format(space))
Это также полностью невосприимчиво к проблемам с файлами с необычными символами в их именах. И он подсчитывает пространство, потребляемое скрытыми файлами.
Это вычисляет не может , что совпадает с тем, что печатает ls -l. Если вы хотите, чтобы количество фактически занятых байтов на диске (что du печатает), замените .st_size на .st_blocks * 512. (Да, множитель всегда 512, даже если st_blksize - это другое число.)
То, что вы видите здесь, - это способ отображения больших чисел. Например:
1.23e+3 = 1.23*10^3 = 1230
Насколько я знаю, вы не можете отключить это, но, как вы писали в своем вопросе, du ведет себя по-другому, поэтому я бы рекомендовал использовать это. В противном случае вам придется преобразовать числа.