Найти доступное дисковое пространство в unix без анализа вывода `df`
Когда я печатаю df -k .
Я получаю следующий вывод
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/sda2 16512936 8650196 7023932 56% /
Что я делаю, так это хвост последней строки и извлечение четвертого поля, чтобы получить его правильно.
Но если имя файловой системы длинное, скажем, например, /dev/niraj-asdsdsd-dsdsdsa
, затем df
печатает дальнейшие детали на новой строке и, используя мою логику, я получаю 56% вместо 7023932.
Итак, мой вопрос, как определить точное свободное пространство в любой ситуации?
4 ответа
stat
Утилита, которая удобна для получения файловой статистики, также может дать вам информацию о файловых системах, просто укажите -f
вариант.
Но убедитесь, что вы указали точку монтирования (например, /boot
), а не файл устройства (/dev/sda1
)! Потому что в последнем случае stat
будет сообщать статистику /dev
файловая система, которая (в Debian) является виртуальной файловой системой и не имеет ничего общего с физическим диском:
$ mount | grep sda1 / dev / sda1 on / тип загрузки ext2 (rw,relaytime, ошибки = продолжить, user_xattr, acl) $ env stat -f / dev / sda2 Файл: "/dev/sda1" ID: 0 Namelen: 255 Тип: tmpfs Размер блока: 4096 Размер основного блока: 4096 Блоки: Всего: 2560 Свободно: 2560 Доступно: 2560 Иноды: Всего: 497355 Свободно: 496852 $ env stat -f / boot Файл: "/boot" ID: fe082d7c0c42ea6f Namelen: 255 Тип: ext2/ext3 Размер блока: 1024 Размер основного блока: 1024 Блоки: Всего: 99150 Свободно: 52490 Доступно: 47370 Иноды: Всего: 25688 Свободно: 25355
- Разница между свободным и доступным счетчиком получается из зарезервированных блоков для root.
- я использовал
env
чтобы убедиться, что не используется встроенная команда stat вашей оболочки (которая может предоставлять или не предоставлять все используемые параметры).
Итак, чтобы ответить на ваш вопрос, вы можете использовать -c
) формат вывода статистики для получения доступного пространства (%a
) на /
:
$ env stat -f -c %a /
1711744
Это в блоках, так что будьте умны и позвольте системе делать умножение с размером блока в килобайтах (%S/1024
), передавая вывод в bc
калькулятор:
$ env stat -f -c '%a*%S/1024' / | bc
6846976
Давайте проверим с df
:
$ df /
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/sda2 25066604 16939628 6846976 72% /
Хорошо, тот же номер сообщил!
Большое спасибо, у меня были проблемы с df, так как в зависимости от системы он получает 3-й или 4-й столбец, таким образом я решил это! Я разрабатывал bash-скрипт для проверки доступного места в /, /boot и /var в различных системах и отправки отчета, если объем меньше определенного МБ.
Я преобразовал его в МБ, так как мне его легче читать, просто добавив еще одно деление
echo $(env stat -f -c '%a*%S/1024/1024' /boot | bc)MB free on /boot
Niraj - Have you looked at the di utility? This might offer at least an easier way to extract the data you need, it offers a CSV format output of the drive space.
di -c
Чтобы показать доступное дисковое пространство в Кб или Мб, вы можете использовать следующую команду:
export LC_NUMERIC="en_ZA.utf8" && free_disk_space_before=$(env stat -f -c '%a*%S/1024' / | bc) && echo "Free Disk Space:" $(/usr/bin/printf "%'3.3f" ${free_disk_space_before}) "Kb"
export LC_NUMERIC="en_ZA.utf8" && free_disk_space_before=$(env stat -f -c '%a*%S/1024/1024' / | bc) && echo "Free Disk Space:" $(/usr/bin/printf "%'d" ${free_disk_space_before}) "Mb"
Результаты приведены ниже:
Free Disk Space: 874,064 Kb
Free Disk Space: 874 Mb
Преобразование в en_ZA.utf8 — это всего лишь один из способов поставить запятую между тысячами.