Trouvez les plus gros fichiers ou répertoires

10

Quelle commande imprimera les tailles de tous les fichiers et répertoires du répertoire tmp (y compris ceux cachés) et les triera par tailles du plus grand au plus petit au format lisible par l'homme (par exemple 2 Go)?

La sortie pourrait être la suivante:

file.mpg 2GB
file.avi 1.8GB
.backtup 1.7 GB (this is directory)

J'ai essayé d'utiliser les commandes lset dumais je n'ai pas pu trouver les bons commutateurs.

xralf
la source

Réponses:

7

Voici une solution rapide, utilisez du + sort. Essaye ça:

du -smc * | sort -n

Cela ignorera les fichiers cachés, mais c'est une autre solution facile:

du -smc .[^.] .??* * | sort -n

Cela peut provoquer des avertissements si un ou plusieurs des modèles ci-dessus ne correspondent pas à un fichier. Le premier modèle .[^.]correspond aux deux noms de fichiers de caractères commençant par. à l'exception de .., le deuxième motif, .??*correspond aux trois lettres ou plus des noms de fichiers commençant par. et * correspond à tous les fichiers ne commençant pas par. Pour une liste plus sophistiquée telle que trouver tous les fichiers plus grands que X sur un système de fichiers entier, ou maintenir une liste de croissance du système de fichiers, j'ai un script shell DIY que j'ai écrit et que je peux partager si cela vous intéresse.

pingouin359
la source
Je vous remercie. Je suis intéressé par votre script si vous êtes si gentil.
xralf
1
Utilisez sort -nrsi vous voulez les plus grandes valeurs en haut.
LawrenceC
3

Pour répertorier les fichiers n'importe où sous /tmp, triés par taille:

find /tmp -type f -exec du -k {} + | sort -k1n -k2

Pour répertorier les fichiers et les arborescences de répertoires immédiatement sous /tmp, triés par taille:

du -k /tmp/..?* /tmp/.[!.]* /tmp* 2>/dev/null | sort -k1n -k2

Pour répertorier tous les fichiers et arborescences de répertoires n'importe où sous /tmp, triés par taille:

du -ak /tmp | sort -k1n -k2

(Un exemple pour illustrer la différence entre les trois commandes: s'il y a un fichier /tmp/dir/file, la première liste de commandes /tmp/dir/file, la deuxième liste /tmp/diret la troisième liste les deux.)

Toutes les commandes ci-dessus affichent les tailles en kilo-octets. Alors que GNU du peut produire des tailles «lisibles par l'homme» (avec des multiplicateurs k, M, G, etc.), leur tri est une autre affaire. Des coreutils GNU assez récents (≥7.4) peuvent le faire: remplacez simplement du -kpar du -het sort -k1n -k2par sort -k1h -k2. Sinon, voici un script awk grossier à convertir en tailles suffixées (arrondi vers le bas); il suffit de diriger la sortsortie ci-dessus.

awk -vFS='\t' -vOFS='\t' '{
    if ($1) $1 = substr($1,1,(length($1)-1)%3+1)
                 substr("kMGTPEZY",(length($1)-1)/3+1,1);
    print}'
Gilles 'SO- arrête d'être méchant'
la source
Je vous remercie. Ces commandes sont utiles, mais je ne m'intéresse qu'aux fichiers et répertoires directement sous tmp, pas aux fichiers dans les sous
xralf
1
@xralf: Utilisez ensuite uniquement la deuxième forme d' duappel.
Gilles 'SO- arrête d'être méchant'
Semble bon, mais le meilleur résultat est avec Mo et Go comme l'a signalé forcefsck.
xralf
3

J'utilise l'alias suivant pour cela: alias ds='du -x --all --max-depth=1 . | sort -n'

Il imprime les tailles de tous les fichiers et les sous-répertoires de premier niveau du répertoire actuel.

rvs
la source
C'est une bonne solution courte, mais elle n'imprime que les répertoires.
xralf
Oh, désolé, tu as raison. Je n'ai jamais rencontré ce problème avec les fichiers. Cependant, j'ai trouvé comment le faire fonctionner avec des fichiers: en utilisant --all swicth.
rvs
Grande solution correcte. penguin359 a légèrement mieux car il affiche les tailles en Mo. Le mieux serait la solution de forcefsck mais sa solution omet les répertoires avec des espaces.
xralf
1

Avec la version actuelle du tri gnu (et emprunt du modèle de fichier @ penguin359)

cd /tmp; du -sShc .[^.] .??* * | sort -h

Avec une ancienne version de sorte

cd /tmp
foo=$(du -sShc .[^.] .??* *)
for u in K M G T; do
    echo "$foo" | egrep "^[0-9\.]+$u" | sort -n
done

EDIT: ajout du paramètre -Sdu pour ne pas inclure les sous-répertoires.

forcefsck
la source
Je voulais plutôt de l'espace disque utilisé par les fichiers et les répertoires (taille totale des données à l'intérieur) directement sous tmp (pas les sous-répertoires). Ma commande de tri n'a pas d'option -h.
xralf
Je ne suis pas sûr à 100% de ce que vous voulez dire, car vous aviez déjà accepté une réponse avec la même sélection de modèle de fichier. Modification de mon message pour ne pas inclure de sous-répertoires. Si vous voulez la taille apparente et non l'espace disque réel utilisé, vous pouvez ajouter --apparent-sizeaux paramètres du.
forcefsck
Maintenant ça marche bien. Je n'ai qu'à chercher GB puis MB, mais ce n'est pas un problème.
xralf
J'avais les lettres unitaires dans le mauvais ordre, maintenant réparées. Si vous voulez que l'ordre soit grand ou petit, changez l'ordre des lettres unitaires et ajoutez -r pour trier.
forcefsck
J'ai remarqué, il a oublié d'imprimer la taille du répertoire (sans préfixe)
xralf
0

MISE À JOUR: J'ai supprimé le script précédent. Voici une nouvelle version, utilisant duet awk (la précédente utilisée treeet sed)

C'est la sortie de: dusort ~/test 1

================
dir     4.10 KiB  /home/user/test/bdir
dir     4.98 KiB  /home/user/test/Kdir
dir   104.91 MiB  /home/user/test/Mdir
dir   587.47 MiB  /home/user/test/Gdir
dir   692.39 MiB  /home/user/test
================
 f      0    Byt  /home/user/test/new file
 f     42    Byt  /home/user/test/.hi   dd     en
================

Voici le script

units() { awk -v pfix="$1" \
  'BEGIN { yect=6  # Array element-count
    split("Byt KiB MiB GiB TiB PiB",lbl)
    for (i=1;i<=yect;i++) { val[i] = (2**(10*(i-1)))-1 } 
  }
  { yess=yect  # Array element-subscript
    while ( $1 < val[yess] ){ yess-- }
    num = $1 / (val[yess]+1)
    sub(/^[0-9]*\t*/,"")
    if (yess!=1) { printf "%s %8.2f %s  %s\n", pfix, num, lbl[yess], $0 }
    else        { printf "%s %5d    %s  %s\n", pfix, num, lbl[yess], $0 }
   }'
}
tdir="/tmp/$USER/$(basename $0)"
[[ ! -d "$tdir" ]] && mkdir -p "$tdir"
file="$tdir/$(date +%N)"
echo "================"
dirs="$file.dirs";   du --max-depth=$2 -b $1  >"$dirs" ; <"$dirs"  sort -n           | units "dir"
echo "================"
filz="$file.filz"; { du --max-depth=$2 -ab $1 ; cat "$dirs" ; } | sort -n | uniq -u  | units " f "
echo "================"
rm   "$file."* 
#
Peter.O
la source
Lorsque vous dites la taille de tous les fichiers et répertoires , voulez-vous dire l'espace que chaque élément occupe sur le disque (par exemple, sur mon système de fichiers Ubuntu ext4 , un répertoire vide prend 4k d'espace disque et un fichier plus petit que 4k prend 4k . Le bloc d'allocation minimum est 4k) .. ou voulez-vous dire la quantité de données dans chaque fichier, par exemple, 100 (octets) .. Et pour les répertoires, voulez-vous connaître le total des données de fichiers dans ce répertoire .. Si vous voulez la taille des données dans les fichiers, alors faites treecela. si vous voulez que l'espace disque soit utilisé, alors ducela fait ... ( treene totalise pas un répertoire)
Peter.O
'du' est le meilleur choix ... Je viens de remarquer man duqu'il peut également signaler la "taille apparente du fichier" .... The apparent size of a file is the number of bytes reported by wc -c 'sur les fichiers normaux, ou plus généralement, ls -l --block-size=1' or stat --format =% s '. Par exemple, un fichier contenant le motzoo' with no newline would, of course, have an apparent size of 3.
Peter.O
Je voulais plutôt de l'espace disque utilisé par les fichiers et répertoires (taille totale des données à l'intérieur) directement sous tmp (pas les sous-répertoires)
xralf
Je suis désolé, je ne suis pas encore au stade de l'écriture de scripts shell, je pourrais le comprendre, alors je laisse le soin aux autres utilisateurs de décider de la bonne réponse. Merci pour votre travail. Je l'étudierai quand je serai mieux.
xralf
0
find /tmp -exec du {} + | sort -nr | less 

affiche les fichiers les plus volumineux en premier, afin que vous puissiez qles voir dès que vous en avez vu assez.

Utilisateur inconnu
la source