Найти доступное дисковое пространство в 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 — это всего лишь один из способов поставить запятую между тысячами.

Другие вопросы по тегам