6 votes

Comment puis-je utiliser la recherche pour sélectionner les utilisateurs ayant une certaine quantité d'espace disque utilisé?

Je veux trouver tous les utilisateurs affichés dans le répertoire /home/ dont la consommation de disque est supérieure à 500 Mo. La commande suivante fonctionne comme prévu.

cd /home/ && du */ -hs
68 Ko    ajay/
902 Mo    john/
250 Mo    websites/

Dans l'exemple ci-dessus, seul 902Mo john/ devrait être retourné.

Comment puis-je faire en sorte que la commande find produise les mêmes résultats ?

4voto

givp Points 798

Pas sûr de pourquoi vous voulez quelque chose comme find, donc voici un scriptlet qui fait ce que vous demandez en bash (mais ne fonctionne pas comme find):

max_size=$((500*1024))
cd /home/ && du -ks */ | while read size user ; do
  if [ $size -gt $max_size ] ; then
    echo "${user%/} dépasse le quota"
  fi
done

Exemple: (avec une taille plus petite):

$ du -sk */
2948    a/
4       a b/
640     b/
48      qt/

$ du -ks */ | while read size user ; do if [ $size -gt 600 ] ; then echo "${user%/} dépasse le quota" ; fi ; done
a dépasse le quota
b dépasse le quota

Le ${user%/} supprime simplement le slash final pour plus de joliesse.

0voto

nheinrichs Points 31

Cela affichera l'utilisation du disque (en ko) des fichiers de chaque utilisateur dans dir quel que soit l'emplacement de ces fichiers:

find dir -printf "%u %b\n" | perl -n -e '@l = split; $sum{$l[0]} += $l[1]; END { foreach(sort(keys(%sum))) { print "$_ ",$sum{$_}/2," Ko\n"; }}'

La commande find affiche le propriétaire et le nombre de blocs de chaque fichier et répertoire dans dir. La commande perl ajoute l'utilisation dans un hachage indexé par le nom d'utilisateur, construisant ainsi une somme des tailles des fichiers de chaque utilisateur; puis le contenu du hachage est affiché.

0voto

Dexter Points 11

Vous ne pouvez pas faire cela uniquement avec find, car find agit sur des fichiers individuels et n'a pas de concept d'addition des tailles de fichiers. Vous pourriez rediriger la sortie de find vers un autre outil, mais pourquoi s'embêter alors que du fait l'essentiel du travail?

du -sm */ | sort -k1,1n | awk '$1 > 500 { sub(/$/, "M", $1); print $0 }'

Le test awk devient compliqué lorsque le suffixe "lisible par l'homme" est inclus dans l'entrée, car vous devez supprimer le "M" final pour effectuer une comparaison d'entiers. Pour la sortie, personnellement, je sauterais le suffixe "M", mais c'est ce qui a été demandé.

0voto

vtest Points 4962

Publication en tant que réponse.

J'ai utilisé du -ms pour obtenir une sortie cohérente pouvant être traitée par awk sans intervention supplémentaire. Vous avez raison que la sortie lisible par l'homme est meilleure, donc la sortie finale est traitée une fois de plus pour cela.

#!/bin/bash

######################################################################
#  AUTEUR: Joe Negron - LOGIC Wizards ~ NYC
#  LICENCE: BuyMe-a-Drinkware: Double BSD ou GPL (choisissez-en un)
#  UTILISATION: byteMe (bytes)
#  RÉSUMÉ: Convertit un paramètre numérique en un format lisible par l'homme.
#  URL: http://www.logicwizards.net/2010/10/19/byteme-a-simple-binary-metrics-bash-script-howto-convert-bytes-into-kb-mb-gb-etc-using-bash-bc/
######################################################################
function byteMe() { # Divise par 2^10 jusqu'à < 1024 puis ajoute le suffixe du métrique
declare -a METRIC=('O' 'Ko' 'Mo' 'Go' 'To' 'Xo' 'Po') # Tableau de suffixes
MAGNITUDE=0  # magnitude de 2^10
PRECISION="scale=1" # changez cette valeur numérique pour augmenter la précision décimale
UNITS=`echo $1 | tr -d ','`  # valeur numérique arg (en octets) à convertir
while [ ${UNITS/.*} -ge 1024 ] # compare des entiers (car pas de flottants en bash)
  do
   UNITS=`echo "$PRECISION; $UNITS/1024" | bc` # math avec des flottants via `bc`
   ((MAGNITUDE++)) # incrémente le compteur pour le pointeur du tableau
  done
echo -n "$UNITS${METRIC[$MAGNITUDE]}"
}

cd /home/ && du */ -bs | awk '$1 > 500 { print $0 }' | while read LINE; do
    SIZE=$(echo "$LINE" | cut -f 1)
    HRSIZE=$(byteMe "$SIZE")
    DIR=$(echo "$LINE" | cut -f 2)
    printf "%8s %s\n" "$HRSIZE" "$DIR"
done

Remarques :

  1. La fonction bash a été trouvée en faisant une recherche sur Google (voir les commentaires)
  2. J'ai changé du -ms en du -bs, rendant ainsi possible l'utilisation de la fonction de conversion qui accepte les octets.
  3. La limite de 500 Mo est toujours codée en dur. N'hésitez pas à modifier le script pour l'accepter en tant qu'argument.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X