Перевірте вільний простір на диску для поточного розділу в bash


118

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

Правка - відповідь, яку я придумав

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

Трохи дивним, оскільки, здається, df форматує свій вихід, щоб він відповідав терміналу, тому при довгій назві точки моменту вихід зміщується вниз по лінії


4
Використовуйте -Pпрапор до df, ви отримаєте все в одному рядку.
Мат

5
пов'язані du -hs .з переглядом дискового простору, який використовується для поточного каталогу.
тут

Як сказав @Mat, ви хочете використовувати -P, якщо підете зі своїм рішенням. У минулому я стикався з дивно відформатованими або давно названими розділами, які спричинили збій сценарію, оскільки прапор -P відсутній.
SuperTetelman

Відповіді:


204

Так:

df -k .

для поточного каталогу.

df -k /some/dir

якщо ви хочете перевірити певний каталог.

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

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

Дякую за це! Стат виглядає на мене трохи розумно. Читання сторінки man говорить про те, що я не хочу -k у своїй версії df, але вкладення шляху допомогло.
Грег Рейнольдс

Ага - тепер я бачу, чому ви використовуєте -k, полегшує обчислення!
Грег Рейнольдс

1
Річ у тому, що багато систем за замовчуванням становлять 512 байт-блоки, якщо ви не вказуєте -k. (coreutils df за замовчуванням до 1k блоків, тому ви досить безпечні в Linux, але якщо у вас є coreutils, у вас є stat, і це навіть безпечніше - не потрібно аналізувати).
Мат

2
У моєму Red-Hat щось, рядок формату має бути %a*%sзамість %a*%S. Я не впевнений, чи це різниця чи помилка.
RnMss

@ RnMss: Це повинно бути %S(капітал) відповідно до сторінки людини на RedHat. Не можу знайти файлову систему, до якої %s != %Sу кількох RedHats я теж маю доступ, тому не можу перевірити :-(
Мат.

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 ;-)
trs


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 / dir / inner_dir /

 or

df -sh / dir / inner_dir /

і знати використання конкретного каталогу в бітах в Linux команда така,

df-k / dir / inner_dir /


0

Введіть командну оболонку:

 df -h 

або

df -m

або

df -k

Він покаже список вільних просторів на диску для кожної точки монтування.

Ви також можете показати / переглянути один стовпець.

Тип:

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

Примітка. Тут 3 - номер стовпця. Ви можете вибрати, який стовпець вам потрібен.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.