Bash'deki geçerli bölüm için boş disk alanını kontrol edin


119

Bash'de bir yükleyici yazıyorum. Kullanıcı hedef dizine gidecek ve kurulum komut dosyasını çalıştıracaktır, bu nedenle ilk eylem yeterli alan olup olmadığını kontrol etmek olmalıdır. Df'nin tüm dosya sistemlerini raporlayacağını biliyorum, ancak sadece hedef dizinin üzerinde olduğu bölüm için boş alan elde etmenin bir yolu olup olmadığını merak ediyordum.

Düzenle - bulduğum cevap

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

Biraz garip çünkü df, çıktısını terminale sığacak şekilde biçimlendiriyor gibi görünüyor, bu nedenle uzun bir bağlama noktası adıyla çıktı bir satır aşağı kaydırılır


4
-PBayrağı kullanmak için kullanın, dfhepsini tek satırda alacaksınız.
Mat

5
ilgili du -hs .geçerli dizinde için kullanımda disk alanı görmek için.
Burada

@Mat'ın dediği gibi, çözümünüzle giderseniz -P kullanmak isteyeceksiniz. Geçmişte, -P bayrağı eksik olduğu için bir betiğin başarısız olmasına neden olan garip bir şekilde biçimlendirilmiş veya uzun adlandırılmış bölümlerle karşılaştım.
SuperTetelman

Yanıtlar:


205

Evet:

df -k .

mevcut dizin için.

df -k /some/dir

belirli bir dizini kontrol etmek istiyorsanız.

stat(1)Sisteminizde varsa komutu da kontrol etmek isteyebilirsiniz . Komut dosyanızın ayrıştırılmasını kolaylaştırmak için çıktı formatları belirtebilirsiniz. İşte küçük bir örnek:

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

Bunun için teşekkürler! stat bana biraz akıllara durgunluk veriyor. Man sayfasını okumak, df sürümümde -k istemediğimi gösteriyor, ancak yolu koymak yardımcı oldu.
Greg Reynolds

Ahh - şimdi neden -k kullandığınızı anlıyorum, hesaplamaları kolaylaştırıyor!
Greg Reynolds

1
Mesele şu ki, belirtmezseniz birçok sistem varsayılan olarak 512 bayt bloğa geçecek -k. (coreutils df varsayılan olarak 1k bloklarıdır, bu nedenle Linux'ta oldukça güvendesiniz - ancak coreutils'iniz varsa stat, daha da güvenlidir - ayrıştırmaya gerek yoktur).
Mat

2
Benim Red-Hat'ımda biçim dizesi %a*%syerine olmalıdır %a*%S. Bunun bir fark mı yoksa yazım hatası mı olduğundan emin değilim.
RnMss

@RnMss: O var gerekiyordu olmak %SRedHat üzerinde adam sayfasına göre (sermaye). %s != %SYine de birkaç Red Hat'ta erişimim olan bir dosya sistemi bulamıyorum , bu yüzden kontrol edemiyorum :-(
Mat

44
  1. df komut: Dosya sistemi disk alanı kullanımını bildir
  2. du komut: Dosya alanı kullanımını tahmin edin

Yazın df -hveya df -kboş disk alanı listelemek için:

 $ df -h

VEYA

 $ df -k

du bir veya daha fazla dosya veya dizinin ne kadar alan kullandığını gösterir:

 $ du -sh

-sSeçenek bir dizin kullanıyor ve uzay özetleyen -hseçeneği sağlar İnsan okunabilir çıktı.


24

Bunun ThinkingMedia'nın bu soruya cevabına bir yorum veya düzenleme olması gerektiğini düşünüyorum ( bash'deki mevcut bölüm için boş disk alanını kontrol edin ), ancak yorum yapmama izin verilmiyor (yeterli temsilci yok) ve düzenlemem reddedildi (neden: "bu bir yorum veya cevap olmalıdır"). Öyleyse lütfen, SO evreninin güçleri, başka birinin "cevabını" tekrarladığım ve düzelttiğim için bana lanet etmeyin. Ama internetteki biri yanılıyordu! ™ ve düzeltmeme izin vermediler.

Kod

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

önemli bir kusuru var: Evet, 50G50 kadar ücretsiz çıktı - ama aynı zamanda 5.0M50 3.4Gkadar 15Kücretsiz veya 34 kadar ücretsiz veya 15 kadar ücretsiz çıktı verecek.

Belli miktarda boş disk alanını kontrol etmek amacıyla bir komut dosyası oluşturmak için, kontrol ettiğiniz birimi bilmeniz gerekir. Çıkarın ( sedyukarıdaki örnekte olduğu gibi) sayılar artık bir anlam ifade etmiyor.

Gerçekten çalışmasını istiyorsanız, aşağıdaki gibi bir şey yapmanız gerekecek:

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;

Ayrıca bir kurulumcu için df -k $INSTALL_TARGET_DIRECTORYdaha mantıklı olabilir df -k "$PWD". Son olarak, lütfen --outputbayrağın her df / linux sürümünde bulunmadığına dikkat edin .


Tüm dağıtımlarda yok--output=avail
Yzmir Ramirez

1
İyi gözlem. Cevabın son cümlesi tam olarak bunu belirtir. @YzmirRamirez ;-)
trs

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

bu şekilde bayt cinsinden boyut elde edersiniz.


Tüm dağıtımlarda yok--output=avail
Yzmir Ramirez

2

Bunu bir sunucudaki bir bağlama noktasını izlemek için kullanmak isteyebilecek biri için eksiksiz bir örnek. Bu örnek / var / spool'un 5G'nin altında olup olmadığını kontrol edecek ve kişiye e-posta gönderecektir:

  #!/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'ta GB veya TB'lerde belirli dizinin kullanımını bilmek için komut şu şekildedir:

df -h / dir / iç_dir /

 or

df -sh / dir / iç_diz /

ve linux'ta belirli bir dizinin bit cinsinden kullanımını bilmek için komut,

df-k / dir / iç_dir /


0

Komut kabuğuna şunu yazın:

 df -h 

veya

df -m

veya

df -k

Her bağlama noktası için boş disk alanlarının listesini gösterecektir.

Tek sütunu da gösterebilir / görüntüleyebilirsiniz.

Tür:

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

Not: Burada 3 sütun numarasıdır. İhtiyacınız olan sütunu seçebilirsiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.