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

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

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

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

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

Ответ 1

Да:

df -k .

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

df -k /some/dir

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

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

$ echo $(($(stat -f --format="%a*%S" .)))

Ответ 2

  • df команда: использование дискового пространства в файловой системе отчета
  • du команда: оценка использования файлового пространства

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

 $ df -h

ИЛИ

 $ df -k

du показывает, сколько пространства используется для большего количества файлов или каталогов.

 $ du -sh

-s укажите суммарное пространство, которое использует каталог, и -h предоставляет отчет для человека.

Ответ 3

Я думаю, что это должен быть комментарий или редактирование ответа ThinkingMedia по этому самому вопросу (Проверить свободное место на диске для текущего раздела в bash), но я мне не разрешено прокомментировать (недостаточно rep), и мое редактирование было отклонено (причина: "это должен быть комментарий или ответ" ). Так что, пожалуйста, силы Вселенной SO, не проклинайте меня за повторение и исправление кого-то другого "отвечают". Но кто-то в интернете ошибался! ™, и они не позволили мне это исправить.

Код

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

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

Чтобы создать script с целью проверки определенного объема свободного места на диске, вам нужно знать, с какой единицей вы проверяете. Удалите его (как 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.

Ответ 4

Чтобы узнать об использовании конкретного каталога в GB или TB в linux, команда:

df -h/dir/internal_dir/

 or

df -sh/dir/inner_dir/

и знать использование конкретного каталога в битах в Linux, команда

df-k/dir/inner_dir/

Ответ 5

Полный пример для тех, кто может захотеть использовать это для мониторинга точки монтирования на сервере. В этом примере будет проверяться, находится ли /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="[email protected]"
  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

Ответ 6

df --output=avail -B 1 "$PWD" |tail -n 1

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

Ответ 7

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

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

Вывод 50G свободный как 50.

Сделать эту часть условия свободного дискового пространства в bash script.

FREE=`df --output=avail -h "$PWD" | sed '1d;s/[^0-9]//g'`
if [[ $FREE -lt 10 ]]; then
         # less than 10GBs free!
fi;