2011-03-06 6 views
6

Quelle est la meilleure pratique pour imprimer une liste des 10 fichiers les plus volumineux dans un shell POSIX? Il doit y avoir quelque chose de plus élégant que ma solution actuelle:Liste lisible, récursive et triée des fichiers les plus volumineux

DIR="." 
N=10 
LIMIT=512000 

find $DIR -type f -size +"${LIMIT}k" -exec du {} \; | sort -nr | head -$N | perl -p -e 's/^\d+\s+//' | xargs -I {} du -h {} 

où LIMIT est un seuil de taille de fichier pour limiter les résultats de découverte.

+0

Avez-vous essayé avec 'du'? –

+0

@TomaszNurkiewicz Oui (voir le script ci-dessus). Le problème est que 'du' ne trie pas les résultats. – Matti

+0

Étant donné un blocage aléatoire sur un système de fichiers, est-il possible de trouver le nom de fichier qui lui est associé? (Pour les blocs qui se trouvent dans un fichier/répertoire). Si c'est le cas, ce serait un moyen très efficace de trouver les fichiers les plus volumineux. (Je suis assez sûr que la réponse est Non, j'ai googlé avant, mais peut-être que SO va trouver quelque chose.) Dépendant du système de fichiers? –

Répondre

6

Ceci utilise awk pour créer des colonnes supplémentaires pour les clés de tri. Il n'appelle qu'une seule fois du. La sortie devrait ressembler exactement à du. Je l'ai divisé en plusieurs lignes, mais il peut être recombiné en une seule ligne.

du -h | 
    awk '{printf "%s %08.2f\t%s\n", 
    index("KMG", substr($1, length($1))), 
    substr($1, 0, length($1)-1), $0}' | 
    sort -r | cut -f2,3 

Explication:

  • BEGIN - créer une chaîne de caractères à l'index pour remplacer 1, 2, 3 K, M, G pour le groupement des unités, s'il n'y a pas d'unité (la taille est inférieure à 1K), alors il n'y a pas de correspondance et un zéro est renvoyé (parfait!)
  • imprime les nouveaux champs - unité, valeur (pour que le tri alpha fonctionne correctement, il est rembourré, longueur fixe) et la ligne originale
  • indexer le dernier caractère du champ de taille
  • tirer la partie numérique du genre taille
  • les résultats, jetez les colonnes supplémentaires

Essayez sans la commande cut pour voir ce qu'il fait.

Edit:

Voici une version qui fait le tri dans le script AWK et n'a pas besoin coupé:

du -h | 
    awk '{idx = sprintf("%s %08.2f %s", 
     index("KMG", substr($1, length($1))), 
     substr($1, 0, length($1)-1), $0); 
     lines[idx] = $0} 
    END {c = asorti(lines, sorted); 
     for (i = c; i >= 1; i--) 
      print lines[sorted[i]]}' 
Questions connexes