Проверить свободное место на диске для текущего раздела в bash

119

Пишу установщик на bash. Пользователь перейдет в целевой каталог и запустит сценарий установки, поэтому первым делом следует проверить, достаточно ли места. Я знаю, что df сообщит обо всех файловых системах, но мне было интересно, есть ли способ получить свободное пространство только для раздела, на котором находится целевой каталог.

Изменить - ответ, который я придумал

df $PWD | awk '/[0-9]%/{print $(NF-2)}'

Немного странно, потому что df, похоже, форматирует свой вывод, чтобы он соответствовал терминалу, поэтому с длинным именем точки монтирования вывод смещается на строку

Грег Рейнольдс
источник
4
Используйте этот -Pфлаг df, чтобы получить все в одной строке.
Mat
5
связанные du -hs .с просмотром используемого дискового пространства для текущего каталога.
здесь
Как сказал @Mat, вы захотите использовать -P, если вы пойдете со своим решением. Раньше я встречал разделы со странным форматом или с длинными именами, которые приводили к сбою сценария из-за отсутствия флага -P.
SuperTetelman

Ответы:

205

Да:

df -k .

для текущего каталога.

df -k /some/dir

если вы хотите проверить конкретный каталог.

Вы также можете проверить stat(1)команду, если она есть в вашей системе. Вы можете указать форматы вывода, чтобы облегчить анализ сценария. Вот небольшой пример:

$ echo $(($(stat -f --format="%a*%S" .)))
Мат
источник
Спасибо за это! stat мне кажется немного умопомрачительным. Чтение страницы руководства предполагает, что я не хочу использовать -k в моей версии df, но указание пути помогло.
Грег Рейнольдс
Ах, теперь я понимаю, почему вы используете -k, это упрощает вычисления!
Грег Рейнольдс
1
Дело в том, что многие системы по умолчанию будут использовать блоки размером 512 байт, если вы не укажете -k. (coreutils df по умолчанию имеет 1k блоков, поэтому вы в значительной степени в безопасности в Linux - но если у вас есть coreutils, у вас есть stat, и это даже безопаснее - синтаксический анализ не требуется).
Mat
2
В моем Red-Hat что-то строка формата должна быть %a*%sвместо %a*%S. Не уверен, разница это или опечатка.
RnMss
@RnMss: Согласно справочной странице RedHat, это должно быть %S(заглавная). Не могу найти файловую систему, к которой %s != %Sу меня тоже есть доступ к нескольким RedHats, поэтому не могу проверить :-(
Mat
44
  1. df команда: Отчет об использовании дискового пространства файловой системы
  2. du команда: Оценить использование файлового пространства

Введите df -hили, df -kчтобы указать свободное место на диске:

 $ df -h

ИЛИ

 $ df -k

du показывает, сколько места используют один или несколько файлов или каталогов:

 $ du -sh

-sВариант суммирует пространство каталог использует и -hпараметр обеспечивает человеко-читаемый вывод.

Гириш
источник
24

Я думаю, что это должен быть комментарий или редактирование ответа ThinkingMedia на этот самый вопрос ( проверьте свободное место на диске для текущего раздела в bash ), но мне не разрешено комментировать (недостаточно репутации), и мое изменение было отклонено (причина: «это должен быть комментарий или ответ»). Так что, пожалуйста, силы вселенной ТАК, не проклинайте меня за повторение и исправление чужого «ответа». Но кто-то в Интернете ошибался! ™ и не разрешили мне это исправить.

Код

  df --output=avail -h "$PWD" | sed '1d;s/[^0-9]//g'

имеет существенный недостаток: да, он будет выводить 50Gбесплатно как 50, но он также будет выводить 5.0Mбесплатно как 50, или 3.4Gсвободный как 34, или 15Kсвободный как 15.

Чтобы создать скрипт с целью проверки определенного количества свободного дискового пространства, вы должны знать устройство, с которым вы проверяете. Удалите его (как sedв примере выше) числа больше не имеют смысла.

Если вы действительно хотите, чтобы он работал, вам нужно будет сделать что-то вроде:

FREE=`df -k --output=avail "$PWD" | tail -n1`   # df -k not df -h
if [[ $FREE -lt 10485760 ]]; then               # 10G = 10*1024*1024k
     # less than 10GBs free!
fi;

Также для установщика df -k $INSTALL_TARGET_DIRECTORYможет иметь больше смысла, чем df -k "$PWD". Наконец, обратите внимание, что --outputфлаг доступен не во всех версиях df / linux.

транзистор
источник
Не во всех дистрибутивах есть--output=avail
Измир Рамирес,
1
Хорошее наблюдение. Именно об этом говорится в последнем предложении ответа. @YzmirRamirez ;-)
ТРС
3
df --output=avail -B 1 "$PWD" |tail -n 1

таким образом вы получаете размер в байтах.

xerostomus
источник
Не во всех дистрибутивах есть--output=avail
Измир Рамирес,
2

Полный пример для тех, кто может захотеть использовать это для отслеживания точки монтирования на сервере. В этом примере проверяется, находится ли / var / spool ниже 5G, и отправляется электронное письмо человеку:

  #!/bin/bash
  # -----------------------------------------------------------------------------------------
  # SUMMARY: Check if MOUNT is under certain quota, mail us if this is the case
  # DETAILS: If under 5G we have it alert us via email. blah blah  
  # -----------------------------------------------------------------------------------------
  # CRON: 0 0,4,8,12,16 * * * /var/www/httpd-config/server_scripts/clear_root_spool_log.bash

  MOUNTP=/var/spool  # mount drive to check
  LIMITSIZE=5485760 # 5G = 10*1024*1024k   # limit size in GB   (FLOOR QUOTA)
  FREE=$(df -k --output=avail "$MOUNTP" | tail -n1) # df -k not df -h
  LOG=/tmp/log-$(basename ${0}).log
  MAILCMD=mail
  EMAILIDS="dude@wheres.mycar"
  MAILMESSAGE=/tmp/tmp-$(basename ${0})

  # -----------------------------------------------------------------------------------------

  function email_on_failure(){

          sMess="$1"
          echo "" >$MAILMESSAGE
          echo "Hostname: $(hostname)" >>$MAILMESSAGE
          echo "Date & Time: $(date)" >>$MAILMESSAGE

          # Email letter formation here:
          echo -e "\n[ $(date +%Y%m%d_%H%M%S%Z) ] Current Status:\n\n" >>$MAILMESSAGE
          cat $sMess >>$MAILMESSAGE

          echo "" >>$MAILMESSAGE
          echo "*** This email generated by $(basename $0) shell script ***" >>$MAILMESSAGE
          echo "*** Please don't reply this email, this is just notification email ***" >>$MAILMESSAGE

          # sending email (need to have an email client set up or sendmail)
          $MAILCMD -s "Urgent MAIL Alert For $(hostname) AWS Server" "$EMAILIDS" < $MAILMESSAGE

          [[ -f $MAILMESSAGE ]] && rm -f $MAILMESSAGE

  }

  # -----------------------------------------------------------------------------------------

  if [[ $FREE -lt $LIMITSIZE ]]; then
          echo "Writing to $LOG"
          echo "MAIL ERROR: Less than $((($FREE/1000))) MB free (QUOTA) on $MOUNTP!" | tee ${LOG}
          echo -e "\nPotential Files To Delete:" | tee -a ${LOG}
          find $MOUNTP -xdev -type f -size +500M -exec du -sh {} ';' | sort -rh | head -n20 | tee -a ${LOG}
          email_on_failure ${LOG}
  else
          echo "Currently $(((($FREE-$LIMITSIZE)/1000))) MB of QUOTA available of on $MOUNTP. "
  fi
Майк Кью
источник
1

Чтобы узнать об использовании конкретного каталога в ГБ или ТБ в Linux, команда:

df -h / каталог / внутренний_каталог /

 or

df -sh / каталог / внутренний_каталог /

и чтобы узнать, как используется конкретный каталог в битах в Linux, команда:

df-k / каталог / внутренний_каталог /

Ганеш Хегде
источник
0

Введите в командной оболочке:

 df -h 

или

df -m

или

df -k

Он покажет список свободного дискового пространства для каждой точки монтирования.

Вы также можете отображать / просматривать отдельные столбцы.

Тип:

df -m |awk '{print $3}'

Примечание. Здесь 3 - номер столбца. Вы можете выбрать, какой столбец вам нужен.

Масуд Саркер
источник