260 votes

Quel est le moyen en ligne de commande pour trouver des fichiers/répertoires volumineux à supprimer et libérer de l'espace ?

Je recherche une série de commandes qui me montreront les fichiers les plus volumineux sur un disque.

354voto

Lekensteyn Points 162346

Si vous avez juste besoin de trouver des fichiers volumineux, vous pouvez utiliser find avec le -size option. La commande suivante listera tous les fichiers de plus de 10MiB ( à ne pas confondre avec 10MB ):

find / -size +10M -ls

Si vous voulez trouver des fichiers d'une certaine taille, vous pouvez la combiner avec une recherche "taille inférieure à". La commande suivante recherche les fichiers entre 10MiB et 12MiB :

find / -size +10M -size -12M -ls

apt-cache search 'disk usage' énumère certains programmes disponibles pour l'analyse de l'utilisation du disque. Une application qui semble très prometteuse est gt5 .

D'après la description du paquet :

Les années ont passé et les disques sont devenus de plus en plus grands, mais même sur cette ère de disques durs incroyablement énormes, l'espace semble disparaître avec le temps. Ce petit programme efficace fournit un listing plus pratique que le du(1) par défaut. Il affiche ce qui s'est passé depuis la dernière exécution et affiche la taille du répertoire et le pourcentage total. Il est possible de naviguer et de monter dans les répertoires en utilisant les touches du curseur avec un navigateur basé sur le texte (links, elinks, lynx etc.).

Screenshot of gt5

Dans la section "paquets liés" de gt5 J'ai trouvé ncdu . D'après la description de son emballage :

Ncdu est un visualisateur de du basé sur ncurses. Il fournit une interface rapide et facile à utiliser à travers le célèbre utilitaire du. Il permet de parcourir les répertoires et de montrer les pourcentages d'utilisation du disque avec la bibliothèque ncurses.

Screenshot of ncdu

53voto

Dan King Points 631

Ma solution préférée utilise un mélange de plusieurs de ces bonnes réponses.

du -aBM 2>/dev/null | sort -nr | head -n 50 | more

du arguments :

  • -a pour "tous" les fichiers et répertoires. Laissez-le désactivé pour les répertoires seulement
  • -BM pour afficher les tailles en mégaoctets (M) et les tailles de blocs (B)
  • 2>/dev/null - exclure les messages d'erreur "permission denied" (merci @Oli)

sort arguments :

  • -n pour "numérique
  • -r pour "inverse" (du plus grand au plus petit)

head arguments :

  • -n 50 pour les 50 premiers résultats seulement.
  • Laissez tomber more si vous utilisez un nombre plus petit

Note : Préfixer avec sudo pour inclure les répertoires auxquels votre compte n'a pas le droit d'accéder.

Exemple montrant les 10 plus gros fichiers et répertoires dans /var (y compris le grand total).

cd /var
sudo du -aBM 2>/dev/null | sort -nr | head -n 10
7555M   .
6794M   ./lib
5902M   ./lib/mysql
3987M   ./lib/mysql/my_database_dir
1825M   ./lib/mysql/my_database_dir/a_big_table.ibd
997M    ./lib/mysql/my_database_dir/another_big_table.ibd
657M    ./log
629M    ./log/apache2
587M    ./log/apache2/ssl_access.log
273M    ./cache

37voto

Mufaka Points 54

J'utilise juste une combinaison de du y sort .

sudo du -sx /* 2>/dev/null | sort -n

0   /cdrom
0   /initrd.img
0   /lib64
0   /proc
0   /sys
0   /vmlinuz
4   /lost+found
4   /mnt
4   /nonexistent
4   /selinux
8   /export
36  /media
56  /scratchbox
200 /srv
804 /dev
4884    /root
8052    /bin
8600    /tmp
9136    /sbin
11888   /lib32
23100   /etc
66480   /boot
501072  /web
514516  /lib
984492  /opt
3503984 /var
7956192 /usr
74235656    /home

Alors c'est une affaire de rincer et répéter . Ciblez les sous-répertoires que vous pensez être trop gros, exécutez la commande pour eux et vous découvrirez la cause du problème.

Note : J'utilise du 's -x drapeau pour garder les choses limitées à un seul système de fichiers (j'ai un arrangement assez compliqué de choses montées en croisé entre SSD et RAID5).

Note 2 : 2>/dev/null redirige tout message d'erreur vers l'oubli. S'ils ne vous dérangent pas, ce n'est pas obligatoire.

17voto

kenorb Points 8840

Pour afficher les 20 plus grands répertoires (de manière récursive) dans le dossier actuel, utilisez la phrase suivante :

du -ah . | sort -rh | head -20

ou (plus orienté Unix) :

du -a . | sort -rn | head -20

Pour les 20 plus gros fichiers du répertoire actuel (de manière récursive) :

ls -1Rs | sed -e "s/^ *//" | grep "^[0-9]" | sort -nr | head -n20

ou avec des tailles lisibles par l'homme :

ls -1Rhs | sed -e "s/^ *//" | grep "^[0-9]" | sort -hr | head -n20

Veuillez noter que -h est disponible pour GNU sort uniquement, donc pour qu'il fonctionne correctement sous OSX/BSD, vous devez l'installer à partir de la page d'accueil du site. coreutils . Ensuite, ajoutez son dossier dans votre PATH .

Ainsi, ces alias sont utiles pour avoir dans votre rc (à chaque fois que vous en avez besoin) :

alias big='du -ah . | sort -rh | head -20'
alias big-files='ls -1Rhs | sed -e "s/^ *//" | grep "^[0-9]" | sort -hr | head -n20'

10voto

snitko Points 3477

La réponse de qbi est correcte mais elle sera très lente lorsqu'il y a beaucoup de fichiers car elle lancera un nouveau processus ls pour chaque élément.

une version beaucoup plus rapide de find sans créer de processus enfant serait d'utiliser printf pour afficher la taille en octets (%s) et le chemin (%p).

find "$directory" -type f -printf "%s - %p\n" | sort -n | tail -n $num_entries

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