Sprawdź wolne miejsce na dysku dla bieżącej partycji w bash

118

Piszę instalator w bash. Użytkownik przejdzie do katalogu docelowego i uruchomi skrypt instalacyjny, więc pierwszą czynnością powinno być sprawdzenie, czy jest wystarczająco dużo miejsca. Wiem, że df zgłosi wszystkie systemy plików, ale zastanawiałem się, czy istnieje sposób na uzyskanie wolnego miejsca tylko dla partycji, na której znajduje się katalog docelowy.

Edycja - odpowiedź, którą wymyśliłem

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

Nieco dziwne ponieważ df wydaje się formatować swoje wyjście tak, aby pasowało do terminala, więc przy długiej nazwie punktu montowania wyjście jest przesuwane w dół o linię

Greg Reynolds
źródło
4
Użyj -Pflagi df, aby uzyskać wszystko w jednej linii.
Mat,
5
związane du -hs .z wyświetlaniem miejsca na dysku używanego dla bieżącego katalogu.
tutaj
Jak powiedział @Mat, będziesz chciał użyć -P, jeśli zdecydujesz się na swoje rozwiązanie. W przeszłości napotkałem dziwnie sformatowane lub nazwane partycje, które powodowały awarię skryptu z powodu braku opcji -P.
SuperTetelman

Odpowiedzi:

204

Tak:

df -k .

dla bieżącego katalogu.

df -k /some/dir

jeśli chcesz sprawdzić konkretny katalog.

Możesz również sprawdzić stat(1)polecenie, jeśli Twój system je ma. Możesz określić formaty wyjściowe, aby ułatwić analizę skryptu. Oto mały przykład:

$ echo $(($(stat -f --format="%a*%S" .)))
Mata
źródło
Dziękuję za to! stat wygląda dla mnie nieco oszałamiająco. Czytanie strony podręcznika sugeruje, że nie chcę -k w mojej wersji df, ale wstawienie ścieżki pomogło.
Greg Reynolds
Ahh - teraz rozumiem, dlaczego używasz -k, ułatwia obliczenia!
Greg Reynolds
1
Chodzi o to, że wiele systemów domyślnie będzie miało 512-bajtowe bloki, jeśli tego nie określisz -k. (coreutils df domyślnie to 1k bloków, więc jesteś całkiem bezpieczny w Linuksie - ale jeśli masz coreutils, masz stat, a to jest jeszcze bezpieczniejsze - nie jest wymagane analizowanie).
Mat
2
W moim czymś Red-Hat, ciąg formatu powinien być %a*%szamiast %a*%S. Nie jestem pewien, czy to różnica, czy literówka.
RnMss
@RnMss: Powinien być %S(duży) zgodnie ze stroną podręcznika systemowego RedHat. Nie mogę znaleźć systemu plików, do którego %s != %Sna kilku RedHatach też mam dostęp, więc nie mogę tego sprawdzić :-(
Mat,
44
  1. df polecenie: zgłoś użycie miejsca na dysku w systemie plików
  2. du polecenie: oszacuj użycie przestrzeni plików

Wpisz df -hlub, df -kaby wyświetlić wolne miejsce na dysku:

 $ df -h

LUB

 $ df -k

du pokazuje, ile miejsca zajmuje jeden lub więcej plików lub katalogów:

 $ du -sh

-sOpcja podsumowuje przestrzeń katalogiem korzysta i -hopcja zapewnia czytelny dla człowieka wyjście.

Girish
źródło
24

Myślę, że powinien to być komentarz lub edycja odpowiedzi ThinkingMedia na to właśnie pytanie ( Sprawdź wolne miejsce na dysku dla bieżącej partycji w bash ), ale nie mogę komentować (za mało powtórzeń), a moja edycja została odrzucona (powód: „to powinien być komentarz lub odpowiedź”). Więc proszę, moce wszechświata SO, nie potępiajcie mnie za powtarzanie i naprawianie czyjejś „odpowiedzi”. Ale ktoś w Internecie się mylił! ™ i nie pozwolił mi tego naprawić.

Kod

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

ma istotną wadę: tak, będzie wysyłać 50Gza darmo jako 50 - ale będzie również wysyłać 5.0Mjako wolne jako 50 lub 3.4Gza darmo jako 34 lub 15Kza darmo jako 15.

Aby utworzyć skrypt w celu sprawdzenia określonej ilości wolnego miejsca na dysku, musisz znać jednostkę, z którą sprawdzasz. Usuń to (tak sedjak w powyższym przykładzie) liczby nie mają już sensu.

Jeśli naprawdę chcesz, żeby to działało, będziesz musiał zrobić coś takiego:

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;

Również dla instalatora df -k $INSTALL_TARGET_DIRECTORYmoże to mieć większy sens niż df -k "$PWD". Na koniec należy pamiętać, że --outputflaga nie jest dostępna we wszystkich wersjach df / linux.

trs
źródło
Nie wszystkie dystrybucje mają--output=avail
Yzmir Ramirez
1
Dobra obserwacja. Dokładnie to stwierdza ostatnie zdanie odpowiedzi. @YzmirRamirez ;-)
trs
3
df --output=avail -B 1 "$PWD" |tail -n 1

w ten sposób otrzymujesz rozmiar w bajtach.

xerostomus
źródło
Nie wszystkie dystrybucje mają--output=avail
Yzmir Ramirez
2

Kompletny przykład dla kogoś, kto może chcieć użyć tego do monitorowania punktu montowania na serwerze. Ten przykład sprawdzi, czy / var / spool jest poniżej 5G i wyśle ​​wiadomość e-mail do tej osoby:

  #!/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
źródło
1

Aby poznać użycie określonego katalogu w GB lub TB w systemie Linux, polecenie brzmi:

df -h / dir / internal_dir /

 or

df -sh / dir / internal_dir /

i aby poznać użycie określonego katalogu w bitach w systemie Linux, polecenie brzmi:

df-k / dir / internal_dir /

ganesh hegde
źródło
0

Wpisz w powłoce poleceń:

 df -h 

lub

df -m

lub

df -k

Wyświetli listę wolnych miejsc na dysku dla każdego punktu montowania.

Możesz również wyświetlić / wyświetlić pojedynczą kolumnę.

Rodzaj:

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

Uwaga: tutaj 3 to numer kolumny. Możesz wybrać potrzebną kolumnę.

Masud Sarker
źródło