Kiểm tra dung lượng ổ đĩa trống cho phân vùng hiện tại trong bash


118

Tôi đang viết một trình cài đặt trong bash. Người dùng sẽ đi đến thư mục đích và chạy tập lệnh cài đặt, vì vậy hành động đầu tiên là kiểm tra xem có đủ dung lượng hay không. Tôi biết rằng df sẽ báo cáo tất cả các hệ thống tệp, nhưng tôi đã tự hỏi liệu có cách nào để có được không gian trống chỉ cho phân vùng có thư mục đích không.

Chỉnh sửa - câu trả lời tôi đã nghĩ ra

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

Hơi kỳ lạ vì df dường như định dạng đầu ra của nó để phù hợp với thiết bị đầu cuối, vì vậy với tên điểm gắn kết dài, đầu ra được chuyển xuống một dòng


4
Sử dụng -Pcờ df, bạn sẽ nhận được tất cả trên một dòng.
Mat

5
liên quan du -hs .để xem dung lượng đĩa đang sử dụng cho thư mục hiện tại.
tại đây

Như @Mat đã nói, bạn sẽ muốn sử dụng -P nếu bạn đi cùng với giải pháp của mình. Trước đây, tôi đã gặp phải các phân vùng có định dạng kỳ lạ hoặc có tên dài khiến tập lệnh bị lỗi vì thiếu cờ -P.
SuperTetelman

Câu trả lời:


204

Đúng:

df -k .

cho thư mục hiện tại.

df -k /some/dir

nếu bạn muốn kiểm tra một thư mục cụ thể.

Bạn cũng có thể muốn kiểm tra stat(1)lệnh nếu hệ thống của bạn có nó. Bạn có thể chỉ định các định dạng đầu ra để giúp tập lệnh của bạn phân tích cú pháp dễ dàng hơn. Đây là một ví dụ nhỏ:

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

Cảm ơn vì điều đó! stat trông hơi khó chịu với tôi. Đọc trang người đàn ông cho thấy tôi không muốn -k trên phiên bản df của mình, nhưng đặt đường dẫn vào đã giúp ích.
Greg Reynolds

Ahh - bây giờ tôi hiểu lý do tại sao bạn sử dụng -k, làm cho các phép tính dễ dàng hơn!
Greg Reynolds

1
Vấn đề là nhiều hệ thống sẽ mặc định là khối 512 byte nếu bạn không chỉ định -k. (coreutils df mặc định là 1k khối, vì vậy bạn khá an toàn trên Linux - nhưng nếu bạn có coreutils, bạn có stat, và điều đó thậm chí còn an toàn hơn - không cần phân tích cú pháp).
Mat

2
Trong Red-Hat của tôi, chuỗi định dạng nên được %a*%sthay vì %a*%S. Tôi không chắc đây là sự khác biệt hay lỗi đánh máy.
RnMss

@RnMss: Nó được cho là %S(vốn) theo trang người đàn ông trên RedHat. Tuy nhiên, không thể tìm thấy hệ thống tệp %s != %Strong một số RedHats mà tôi cũng có quyền truy cập, vì vậy không thể kiểm tra :-(
Mat

43
  1. df lệnh: Báo cáo việc sử dụng dung lượng đĩa hệ thống tệp
  2. du lệnh: Ước tính mức sử dụng dung lượng tệp

Nhập df -hhoặc df -kđể liệt kê dung lượng đĩa trống:

 $ df -h

HOẶC LÀ

 $ df -k

du cho biết dung lượng một hoặc nhiều tệp hoặc thư mục đang sử dụng:

 $ du -sh

Các -stùy chọn tóm tắt các không gian một thư mục đang sử dụng và -htùy chọn cung cấp nhân lực có thể đọc được đầu ra.


24

Tôi nghĩ đây phải là một nhận xét hoặc một chỉnh sửa cho câu trả lời của ThinkingMedia về chính câu hỏi này ( Kiểm tra dung lượng đĩa trống cho phân vùng hiện tại trong bash ), nhưng tôi không được phép nhận xét (không đủ đại diện) và chỉnh sửa của tôi đã bị từ chối (lý do: "đây phải là một bình luận hoặc một câu trả lời"). Vì vậy, làm ơn, các cường quốc của vũ trụ SO, đừng chết tiệt khi tôi lặp lại và sửa "câu trả lời" của người khác. Nhưng ai đó trên internet đã sai! ™ và họ sẽ không để tôi sửa nó.

Mật mã

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

có một lỗ hổng đáng kể: Có, nó sẽ xuất ra 50Gmiễn phí là 50 - nhưng nó cũng sẽ xuất 5.0Mmiễn phí là 50 hoặc 3.4Gmiễn phí là 34 hoặc 15Kmiễn phí là 15.

Để tạo một tập lệnh với mục đích kiểm tra một lượng không gian đĩa trống nhất định, bạn phải biết đơn vị bạn đang kiểm tra. Loại bỏ nó (như sedtrong ví dụ trên) các con số không còn ý nghĩa nữa.

Nếu bạn thực sự muốn nó hoạt động, bạn sẽ phải làm một số việc như:

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;

Ngoài ra đối với một trình cài đặt df -k $INSTALL_TARGET_DIRECTORYcó thể có ý nghĩa hơn df -k "$PWD". Cuối cùng, xin lưu ý rằng --outputcờ không có sẵn trong mọi phiên bản df / linux.


Không phải tất cả distro có--output=avail
Yzmir Ramirez

1
Quan sát tốt. Đó chính xác là những gì câu cuối cùng của câu trả lời nói. @YzmirRamirez ;-)
trs

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

bạn nhận được kích thước tính bằng byte theo cách này.


Không phải tất cả distro có--output=avail
Yzmir Ramirez

2

Một ví dụ hoàn chỉnh cho ai đó có thể muốn sử dụng điều này để giám sát điểm gắn kết trên máy chủ. Ví dụ này sẽ kiểm tra xem / var / spool có dưới 5G hay không và gửi email cho người đó:

  #!/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

Để biết việc sử dụng thư mục cụ thể trong GB hoặc TB trong linux, lệnh là,

df -h / dir / inner_dir /

 or

df -sh / dir / inner_dir /

và để biết việc sử dụng thư mục cụ thể theo từng bit trong linux, lệnh này là,

df-k / dir / inner_dir /


0

Nhập lệnh shell:

 df -h 

hoặc là

df -m

hoặc là

df -k

Nó sẽ hiển thị danh sách không gian đĩa trống cho mỗi điểm gắn kết.

Bạn cũng có thể hiển thị / xem cột đơn.

Kiểu:

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

Lưu ý: Ở đây 3 là số cột. Bạn có thể chọn cột nào bạn cần.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.