Vérifier l'espace disque libre pour la partition actuelle dans bash
j'écris un installateur à bash. L'utilisateur ira dans le répertoire cible et lancera le script d'installation, donc la première action devrait être de vérifier qu'il y a suffisamment d'espace. Je sais que df signalera tous les systèmes de fichiers, mais je me demandais s'il y avait un moyen d'obtenir l'espace libre juste pour la partition sur laquelle se trouve le répertoire cible.
Edit - la réponse que j'ai trouvé avec
df $PWD | awk '/[0-9]%/{print $(NF-2)}'
légèrement étrange car df semble formater son sortie pour s'adapter au terminal, donc avec un nom de point de montage long la sortie est décalée le long d'une ligne
8 réponses
Oui:
df -k .
pour le répertoire courant.
df -k /some/dir
si vous voulez vérifier un répertoire spécifique.
vous pourriez aussi vouloir vérifier la commande stat(1)
si votre système l'a. Vous pouvez spécifier les formats de sortie pour faciliter l'analyse de votre script. Voici un petit exemple:
$ echo $(($(stat -f --format="%a*%S" .)))
-
df
commande : Utilisation de l'espace disque du système de fichiers de rapport -
du
commande: estimation de l'utilisation de l'espace dans les fichiers
Type df -h
ou df -k
pour la liste d'espace libre sur le disque:
$ df -h
ou
$ df -k
du
montre combien d'espace un ou plusieurs fichiers ou répertoires utilise.
$ du -sh
-s
l'option résume l'espace qu'un répertoire utilise et l'option -h
fournit la sortie lisible par L'humain .
je pense que cela devrait être un commentaire ou une édition à la réponse de ThinkingMedia sur cette question même ( vérifier l'espace disque libre pour la partition actuelle dans bash ), mais je ne suis pas autorisé à commenter (pas assez de rep) et mon édition a été rejetée (raison:"ceci devrait être un commentaire ou une réponse"). Alors s'il vous plaît, puissances de L'univers, ne me damnez pas pour répéter et réparer la "réponse"de quelqu'un d'autre. Mais quelqu'un sur internet est faux!™ et ils ne me laissaient pas de le corriger.
le code
df --output=avail -h "$PWD" | sed '1d;s/[^0-9]//g'
a un défaut important:
Oui, il affichera 50G
libre comme 50 -- mais il affichera aussi 5.0M
libre comme 50 ou 3.4G
libre comme 34 ou 15K
libre comme 15.
pour créer un script dans le but de vérifier une certaine quantité d'espace disque libre, vous devez connaître l'unité contre laquelle vous vérifiez. Supprimez - le (comme le fait sed
dans l'exemple ci-dessus) les nombres ne pas faire plus aucun sens.
si vous voulez vraiment que cela fonctionne, vous devrez faire quelque chose comme:
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;
aussi pour un installateur à df -k $INSTALL_TARGET_DIRECTORY
pourrait avoir plus de sens que df -k "$PWD"
.
Enfin, veuillez noter que le drapeau --output
n'est pas disponible dans toutes les versions de DF / linux.
pour connaître l'usage du répertoire spécifique dans les GB ou TB dans linux la commande est,
df -h /dir/inner_dir/
or
df-sh /dir/inner_dir/
et pour connaître l'usage du répertoire spécifique en bits dans linux la commande est,
df-k /dir/inner_dir/
Un exemple complet pour quelqu'un qui souhaiterez peut-être utiliser pour surveiller un point de montage sur un serveur. Cet exemple vérifiera si /var/spool est sous 5G et enverra un email à la personne :
#!/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 "151900920").log
MAILCMD=mail
EMAILIDS="dude@wheres.mycar"
MAILMESSAGE=/tmp/tmp-$(basename "151900920")
# -----------------------------------------------------------------------------------------
function email_on_failure(){
sMess=""
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 "151900920") 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
pour obtenir l'espace disque libre courant dans le format lisible par l'homme avec des lettres. Ce qui suit affichera l'espace libre pour la partition courante, supprimera l'en-tête et les lettres de bande.
df --output=avail -h "$PWD" | sed '1d;s/[^0-9]//g'
Sorties 50G
libre 50
.
pour faire cette partie d'une condition d'espace disque libre en script bash.
FREE=`df --output=avail -h "$PWD" | sed '1d;s/[^0-9]//g'`
if [[ $FREE -lt 10 ]]; then
# less than 10GBs free!
fi;
df --output=avail -B 1 "$PWD" |tail -n 1
vous obtenez la taille en octets de cette façon.
Type dans le shell de commande:
df -h
ou
df-m
ou
df-k
il affichera la liste des espaces disque libres pour chaque point de montage.
vous pouvez afficher/voir la colonne simple aussi.
Type:
df -m |awk '{print }'
Note: ici 3 est le numéro de colonne. Vous pouvez choisir la colonne dont vous avez besoin.