Verifique el espacio libre en disco para la partición actual en bash

118

Estoy escribiendo un instalador en bash. El usuario irá al directorio de destino y ejecutará el script de instalación, por lo que la primera acción debe ser verificar que haya suficiente espacio. Sé que df informará sobre todos los sistemas de archivos, pero me preguntaba si había una manera de obtener el espacio libre solo para la partición en la que se encuentra el directorio de destino.

Editar: la respuesta que se me ocurrió

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

Un poco extraño porque df parece formatear su salida para ajustarse al terminal, por lo que con un nombre de punto de montaje largo, la salida se desplaza hacia abajo una línea

Greg Reynolds
fuente
4
Use la -Pbandera para dfobtenerlo todo en una línea.
Mat
5
relacionado du -hs .para ver el espacio en disco en uso para el directorio actual.
aquí
Como dijo @Mat, querrá usar -P si va con su solución. En el pasado, me he encontrado con particiones con un formato extraño o con nombres largos que hacían que un script fallara porque faltaba el indicador -P.
SuperTetelman

Respuestas:

204

Si:

df -k .

para el directorio actual.

df -k /some/dir

si desea consultar un directorio específico.

También es posible que desee verificar el stat(1)comando si su sistema lo tiene. Puede especificar formatos de salida para facilitar el análisis de su script. He aquí un pequeño ejemplo:

$ echo $(($(stat -f --format="%a*%S" .)))
Estera
fuente
¡Gracias por eso! stat me parece un poco alucinante. Leer la página del manual sugiere que no quiero -k en mi versión de df, pero poner la ruta en sí ayudó.
Greg Reynolds
Ahh, ahora veo por qué usa -k, ¡facilita los cálculos!
Greg Reynolds
1
La cuestión es que muchos sistemas tendrán por defecto bloques de 512 bytes si no los especifica -k. (coreutils df tiene como valor predeterminado 1k bloques, por lo que está bastante seguro en Linux, pero si tiene coreutils, lo tiene stat, y eso es aún más seguro, no se requiere análisis).
Mat
2
En mi Red-Hat algo, la cadena de formato debería ser en %a*%slugar de %a*%S. No estoy seguro de si esto es una diferencia o un error tipográfico.
RnMss
@RnMss: Se supone que es %S(en mayúscula) según la página de manual de RedHat. Sin %s != %Sembargo, no puedo encontrar un sistema de archivos donde en los pocos RedHats tengo acceso, así que no puedo verificar :-(
Mat
43
  1. df comando: Informe el uso del espacio en disco del sistema de archivos
  2. du comando: Estimar el uso del espacio de archivos

Escriba df -ho df -kpara enumerar el espacio libre en disco:

 $ df -h

O

 $ df -k

du muestra cuánto espacio están usando uno o más archivos o directorios:

 $ du -sh

La -sopción resume el espacio que está usando un directorio y la -hopción proporciona una salida legible por humanos .

Girish
fuente
24

Creo que esto debería ser un comentario o una edición de la respuesta de ThinkingMedia en esta misma pregunta ( Verifique el espacio libre en el disco para la partición actual en bash ), pero no puedo comentar (no hay suficiente representante) y mi edición ha sido rechazada (motivo: "esto debe ser un comentario o una respuesta"). Así que, por favor, poderes del universo SO, no me maldigan por repetir y arreglar la "respuesta" de otra persona. ¡Pero alguien en Internet estaba equivocado! ™ y no me dejaron arreglarlo.

El código

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

tiene un defecto sustancial: Sí, se producirá 50Ggratis como 50, pero también saldrá 5.0Mgratis como 50 o 3.4Ggratis como 34 o 15Kgratis como 15.

Para crear un script con el propósito de verificar una cierta cantidad de espacio libre en el disco, debe conocer la unidad con la que está comprobando. Elimínelo (como seden el ejemplo anterior), los números ya no tienen sentido.

Si realmente quiere que funcione, tendrá que hacer algo como:

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;

También para un instalador df -k $INSTALL_TARGET_DIRECTORYpodría tener más sentido que df -k "$PWD". Finalmente, tenga en cuenta que la --outputbandera no está disponible en todas las versiones de df / linux.

trs
fuente
No todas las distribuciones lo tienen--output=avail
Yzmir Ramirez
1
Buena observación. Eso es precisamente lo que dice la última oración de la respuesta. @YzmirRamirez ;-)
trs
3
df --output=avail -B 1 "$PWD" |tail -n 1

obtienes el tamaño en bytes de esta manera.

xerostomus
fuente
No todas las distribuciones lo tienen--output=avail
Yzmir Ramirez
2

Un ejemplo completo para alguien que quiera usar esto para monitorear un punto de montaje en un servidor. Este ejemplo verificará si / var / spool está por debajo de 5G y enviará un correo electrónico a la persona:

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

Para conocer el uso del directorio específico en GB o TB en Linux, el comando es,

df -h / dir / inner_dir /

 or

df -sh / dir / inner_dir /

y para conocer el uso del directorio específico en bits en Linux, el comando es,

df-k / dir / inner_dir /

ganesh hegde
fuente
0

Escriba en el shell de comandos:

 df -h 

o

df -m

o

df -k

Mostrará la lista de espacios libres en disco para cada punto de montaje.

También puede mostrar / ver una sola columna.

Tipo:

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

Nota: Aquí 3 es el número de columna. Puede elegir qué columna necesita.

Masud Sarker
fuente