Periksa ruang disk kosong untuk partisi saat ini di bash

119

Saya menulis penginstal di bash. Pengguna akan pergi ke direktori target dan menjalankan skrip penginstalan, jadi tindakan pertama yang harus dilakukan adalah memeriksa apakah ada cukup ruang. Saya tahu bahwa df akan melaporkan semua sistem file, tetapi saya bertanya-tanya apakah ada cara untuk mendapatkan ruang kosong hanya untuk partisi tempat direktori target berada.

Edit - jawaban yang saya dapatkan

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

Agak aneh karena df tampaknya memformat keluarannya agar sesuai dengan terminal, jadi dengan nama titik pemasangan yang panjang, keluarannya digeser ke bawah satu baris

Greg Reynolds
sumber
4
Gunakan -Pbendera untuk df, Anda akan mendapatkan semuanya dalam satu baris.
Mat
5
terkait du -hs .untuk melihat ruang disk yang digunakan untuk direktori saat ini.
sini
Seperti yang dikatakan @Mat, Anda akan ingin menggunakan -P jika menggunakan solusi Anda. Di masa lalu saya telah menjumpai partisi dengan format aneh atau panjang bernama yang menyebabkan skrip gagal karena -P bendera hilang.
SuperTetelman

Jawaban:

205

Iya:

df -k .

untuk direktori saat ini.

df -k /some/dir

jika Anda ingin memeriksa direktori tertentu.

Anda mungkin juga ingin memeriksa stat(1)perintah jika sistem Anda memilikinya. Anda dapat menentukan format keluaran untuk mempermudah penguraian skrip Anda. Inilah sedikit contoh:

$ echo $(($(stat -f --format="%a*%S" .)))
Tikar
sumber
Terima kasih untuk itu! Stat tampak agak mengejutkan saya. Membaca halaman manual menunjukkan bahwa saya tidak ingin -k pada versi df saya, tetapi memasukkan jalur itu memang membantu.
Greg Reynolds
Ahh - sekarang saya mengerti mengapa Anda menggunakan -k, membuat perhitungannya lebih mudah!
Greg Reynolds
1
Masalahnya adalah banyak sistem akan default ke blok 512 byte jika Anda tidak menentukannya -k. (coreutils df defaultnya adalah 1k blok, jadi Anda cukup aman di Linux - tetapi jika Anda memiliki coreutils, Anda memilikinya stat, dan itu bahkan lebih aman - tidak perlu parsing).
Mat
2
Dalam sesuatu Red-Hat saya, format string harusnya %a*%sbukan %a*%S. Saya tidak yakin apakah ini perbedaan atau salah ketik.
RnMss
@RnMss: Seharusnya menjadi %S(kapital) menurut halaman manual di RedHat. Tidak dapat menemukan sistem file di mana %s != %Spada beberapa RedHats saya juga memiliki akses, jadi tidak dapat memeriksa :-(
Mat
44
  1. df perintah: Laporkan penggunaan ruang disk sistem file
  2. du perintah: Perkirakan penggunaan ruang file

Ketik df -hatau df -kuntuk mencantumkan ruang disk kosong:

 $ df -h

ATAU

 $ df -k

du menunjukkan berapa banyak ruang yang digunakan satu atau lebih file atau direktori:

 $ du -sh

The -spilihan merangkum ruang direktori menggunakan dan -hpilihan menyediakan Manusia dapat dibaca output.

Girish
sumber
24

Saya pikir ini harus menjadi komentar atau edit untuk jawaban ThinkingMedia pada pertanyaan ini ( Periksa ruang disk kosong untuk partisi saat ini di bash ), tetapi saya tidak diizinkan untuk berkomentar (tidak cukup rep) dan hasil edit saya telah ditolak (alasan: "ini harus menjadi komentar atau jawaban"). Jadi tolong, kekuatan alam semesta SO, jangan mengutuk saya karena mengulangi dan memperbaiki "jawaban" orang lain. Tetapi seseorang di internet salah! ™ dan mereka tidak mengizinkan saya memperbaikinya.

Kode

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

memiliki kekurangan substansial: Ya, itu akan menghasilkan keluaran 50Ggratis sebagai 50 - tetapi juga akan menghasilkan keluaran 5.0Mgratis sebagai 50 atau 3.4Ggratis sebagai 34 atau15K gratis sebagai 15.

Untuk membuat skrip dengan tujuan memeriksa sejumlah ruang disk kosong, Anda harus mengetahui unit yang Anda periksa. Hapus itu (sebagaised pada contoh di atas) angkanya tidak masuk akal lagi.

Jika Anda benar-benar ingin berhasil, Anda harus melakukan sesuatu seperti:

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;

Juga untuk penginstal untuk df -k $INSTALL_TARGET_DIRECTORYmungkin lebih masuk akal daripada df -k "$PWD". Terakhir, harap dicatat bahwa --outputflag tidak tersedia di setiap versi df / linux.

trs
sumber
Tidak semua distro memiliki--output=avail
Yzmir Ramirez
1
Pengamatan yang bagus. Tepat seperti itulah kalimat terakhir dari jawaban tersebut. @YzmirRamirez ;-)
trs
3
df --output=avail -B 1 "$PWD" |tail -n 1

Anda mendapatkan ukuran dalam byte dengan cara ini.

xerostomus
sumber
Tidak semua distro memiliki--output=avail
Yzmir Ramirez
2

Contoh lengkap untuk seseorang yang mungkin ingin menggunakan ini untuk memantau titik pemasangan di server. Contoh ini akan memeriksa apakah / var / spool di bawah 5G dan mengirim email ke orang tersebut:

  #!/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
Mike Q
sumber
1

Untuk mengetahui penggunaan direktori tertentu di GB atau TB di linux perintahnya adalah,

df -h / dir / inner_dir /

 or

df -sh / dir / inner_dir /

dan untuk mengetahui penggunaan direktori tertentu dalam bit di linux perintahnya adalah,

df-k / dir / inner_dir /

ganesh hegde
sumber
0

Ketik perintah shell:

 df -h 

atau

df -m

atau

df -k

Ini akan menampilkan daftar ruang disk kosong untuk setiap titik pemasangan.

Anda juga dapat menampilkan / melihat kolom tunggal.

Tipe:

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

Catatan: Di sini 3 adalah nomor kolom. Anda dapat memilih kolom mana yang Anda butuhkan.

Masud Sarker
sumber