ตรวจสอบพื้นที่ว่างในดิสก์สำหรับพาร์ติชันปัจจุบันใน bash


119

ฉันกำลังเขียนโปรแกรมติดตั้งใน bash ผู้ใช้จะไปที่ไดเร็กทอรีเป้าหมายและรันสคริปต์การติดตั้งดังนั้นการดำเนินการแรกควรตรวจสอบว่ามีพื้นที่เพียงพอ ฉันรู้ว่า df จะรายงานระบบไฟล์ทั้งหมด แต่ฉันสงสัยว่ามีวิธีรับพื้นที่ว่างสำหรับพาร์ติชันที่ไดเร็กทอรีเป้าหมายอยู่หรือไม่

แก้ไข - คำตอบที่ฉันคิดขึ้นมา

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

แปลกเล็กน้อยเนื่องจาก df ดูเหมือนจะจัดรูปแบบเอาต์พุตให้พอดีกับเทอร์มินัลดังนั้นด้วยชื่อจุดเมาท์แบบยาวเอาต์พุตจะถูกเลื่อนลงมาหนึ่งบรรทัด


4
ใช้-Pแฟล็กเพื่อdfคุณจะได้รับทั้งหมดในบรรทัดเดียว
จ้า

5
ที่เกี่ยวข้องdu -hs .เพื่อดูเนื้อที่ดิสก์ที่ใช้สำหรับไดเร็กทอรีปัจจุบัน
ที่นี่

ตามที่ @Mat กล่าวไว้คุณจะต้องใช้ -P ถ้าคุณใช้วิธีแก้ปัญหาของคุณ ในอดีตฉันเคยพบพาร์ติชันที่มีรูปแบบแปลก ๆ หรือชื่อยาวที่ทำให้สคริปต์ล้มเหลวเนื่องจากแฟล็ก -P หายไป
SuperTetelman

คำตอบ:


205

ใช่:

df -k .

สำหรับไดเร็กทอรีปัจจุบัน

df -k /some/dir

หากคุณต้องการตรวจสอบไดเร็กทอรีเฉพาะ

คุณอาจต้องการตรวจสอบ stat(1)คำสั่งว่าระบบของคุณมีหรือไม่ คุณสามารถระบุรูปแบบเอาต์พุตเพื่อให้สามารถแยกวิเคราะห์สคริปต์ของคุณได้ง่ายขึ้น นี่คือตัวอย่างเล็กน้อย:

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

ขอบคุณสำหรับสิ่งนั้น! สถิติดูเป็นเรื่องที่น่าเหลือเชื่อสำหรับฉัน การอ่าน man page แสดงให้เห็นว่าฉันไม่ต้องการ -k ในเวอร์ชันของ df แต่การใส่พา ธ นั้นช่วยได้
Greg Reynolds

อ่า - ตอนนี้ฉันรู้แล้วว่าทำไมคุณถึงใช้ -k ทำให้การคำนวณง่ายขึ้น!
Greg Reynolds

1
สิ่งที่เป็นจำนวนมากระบบจะเริ่มต้น 512 -kบล็อกไบต์ถ้าคุณไม่ได้ระบุ (ค่าเริ่มต้นของ coreutils df เป็น 1k บล็อกดังนั้นคุณจึงค่อนข้างปลอดภัยบน Linux แต่ถ้าคุณมี coreutils คุณก็มีstatและปลอดภัยยิ่งขึ้น - ไม่จำเป็นต้องแยกวิเคราะห์)
จ้า

2
ใน Red-Hat ของฉันสตริงรูปแบบควรเป็น%a*%sแทน%a*%S. ฉันไม่แน่ใจว่านี่เป็นความแตกต่างหรือการพิมพ์ผิด
RnMss

@RnMss: ควรจะเป็น%S(ทุน) ตามหน้าคนใน RedHat ไม่พบระบบไฟล์ที่%s != %SRedHats สองสามตัวที่ฉันเข้าถึงได้ดังนั้นจึงไม่สามารถตรวจสอบได้ :-(
Mat

44
  1. df คำสั่ง: รายงานการใช้พื้นที่ดิสก์ของระบบไฟล์
  2. du คำสั่ง: ประมาณการการใช้พื้นที่ไฟล์

พิมพ์df -hหรือdf -kเพื่อแสดงรายการพื้นที่ว่างในดิสก์:

 $ df -h

หรือ

 $ df -k

du แสดงว่าไฟล์หรือไดเร็กทอรีหนึ่งไฟล์หรือมากกว่านั้นใช้พื้นที่เท่าใด:

 $ du -sh

-sตัวเลือกสรุปพื้นที่ไดเรกทอรีใช้และ-hตัวเลือกให้มนุษย์สามารถอ่านเอาท์พุท


24

ฉันคิดว่านี่ควรเป็นความคิดเห็นหรือการแก้ไขคำตอบของ ThinkingMedia สำหรับคำถามนี้ ( ตรวจสอบพื้นที่ว่างในดิสก์สำหรับพาร์ติชันปัจจุบันใน bash ) แต่ฉันไม่ได้รับอนุญาตให้แสดงความคิดเห็น (ตัวแทนไม่เพียงพอ) และการแก้ไขของฉันถูกปฏิเสธ (เหตุผล: "นี่ควรเป็นความคิดเห็นหรือคำตอบ") ดังนั้นได้โปรดพลังของจักรวาล SO อย่าด่าฉันที่ทำซ้ำและแก้ไข "คำตอบ" ของคนอื่น แต่มีคนบนอินเทอร์เน็ตคิดผิด! ™และพวกเขาไม่ยอมให้ฉันแก้ไข

รหัส

  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
Yzmir Ramirez

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

หากต้องการทราบการใช้งานไดเร็กทอรีเฉพาะใน GB หรือ TB ใน 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 นี่คือหมายเลขคอลัมน์ คุณสามารถเลือกคอลัมน์ที่ต้องการได้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.