Comment lister tous les fichiers classés par taille

241

Je voudrais énumérer tous les fichiers dans l'ordre de grand à petit et les fichiers peuvent être présents n'importe où dans un certain dossier.

Joe
la source
5
de man ls:-S sort by file size
ctrl-alt-delor le
Voulez-vous dire “les fichiers sont dans ce répertoire” ou “les fichiers peuvent être dans n'importe quel sous-répertoire”.
ctrl-alt-delor
Si vous pouvez / voulez utiliser un outil graphique, jetez un coup d'œil à QDirStat , anciennement KDirStat .
RhinoDevel

Réponses:

290

Utilisez simplement quelque chose comme:

ls -lS /path/to/folder/

Capital S .

Cela va trier les fichiers par taille.

Regarde aussi:

man ls

-S     sort by file size

Si vous souhaitez trier dans l' ordre inverse , ajoutez simplement -rswitch.

Mise à jour:

Pour exclure des répertoires (et à condition qu'aucun nom de fichier ou lien symbolique ne contienne de caractères de nouvelle ligne):

ls -lS | grep -v '^d' 

Mise à jour 2:

Je vois maintenant comment il montre encore des liens symboliques, qui pourraient être des dossiers. Les liens symboliques commencent toujours par une lettre l, comme dans le lien.

Modifiez la commande pour filtrer a -. Cela ne devrait laisser que des fichiers réguliers:

ls -lS | grep '^-'

Sur mon système, cela ne montre que les fichiers normaux.

mise à jour 3:

Pour ajouter de la récursivité, je laisserais le tri des lignes à la sortcommande et lui dirais d'utiliser la 5ème colonne pour trier.

ls -lR | grep '^-' | sort -k 5 -rn

-rnsignifie inverse et numérique pour obtenir les plus gros fichiers en haut. Inconvénient de cette commande est qu’elle n’indique pas le chemin complet des fichiers.

Si vous avez besoin du chemin complet des fichiers, utilisez quelque chose comme ceci:

find . -type f  -exec du -h {} + | sort -r -h

La findcommande trouvera de manière récursive tous les fichiers dans tous les sous-répertoires de .et appellera du -h(ce qui signifie utilisation du disque -humanreadable ), puis triera à nouveau la sortie. Si votre find/ sortne supporte pas -h, remplacez par du -ket sort -rn. Notez que la taille et l'utilisation du disque ne sont pas la même chose.

Delh
la source
5
dudonne l'utilisation du disque qui est différente de la taille du fichier. Avec (GNU) du -h, le tri numérique ne fonctionne pas (vous aurez besoin de l’ -hoption GNU pour trier). xargs attend une liste de mots entre guillemets éventuellement entrés afin que cela ne fonctionne pas si les noms de fichiers contiennent des blancs ou des caractères entre guillemets.
Stéphane Chazelas
1
Je vois que -S fait ordre de taille décroissant, qu'en est-il ordre croissant?
Demongolem
3
A la suite @ StéphaneChazelas, cela fonctionne pour moi: find . -type f -print0 | xargs -0 du -h | sort -rh. Si vous voulez juste dire que les plus de 30 fichiers: find . -type f -print0 | xargs -0 du -h | sort -rh | head -n 30.
user7543
Salut! Pourriez-vous s'il vous plaît expliquer la + |syntaxe dans + | sort -r -h?
Victor
@Victor, veuillez consulter unix.stackexchange.com/questions/195939/… .
Hew Wolff
25

Vous pouvez utiliser quelque chose comme rechercher et trier.

find . -type f -ls | sort -r -n -k7

(l' -lsoption n'est pas standard, mais se trouve dans de nombreuses implémentations de find, pas seulement GNU. Dans GNU find et d'autres, il affiche quelque chose de similaire à ls -liquelques exceptions près, par exemple, les fichiers avec des ACL ne sont pas marqués avec un +)

Si les noms de fichiers peuvent contenir des caractères de nouvelle ligne, avec GNU find et GNU sort:

find . -type f -ls -printf '\0' | sort -zk7rn | tr -d '\0'
Mark Cohen
la source
Cela suppose que la colonne "groupe" (de -ls) ne contient aucun espace (d'où le paramètre -k 7), mais ce n'est pas nécessairement le cas.
kolistivra
1
pourquoi ne pas simplement trouver ... -print0 | trier -zk7rn0?
Andre de Miranda
10

Avec zsh et GNU ls:

ls -ldU -- **/*(.OL)

(.OL)est un qualificatif glob , .pour sélectionner uniquement les fichiers normaux , OLpour inverser l’ordre par longueur (taille du fichier, o par ordre croissant, par ordre Odécroissant).

(notez que les anciennes versions de zsh avaient des problèmes de taille de fichier supérieure à 2 ^ 32).

Certains systèmes d'exploitation imposent une limite à la taille de la liste d'arguments transmise à une commande. Dans ces cas, vous aurez besoin de:

autoload -U zargs
zargs ./**/*(.OL) -- ls -ldU

Si vous voulez juste la liste des fichiers et non la sortie détaillée, faites simplement:

print -rl -- **/*(.OL)

Si vous souhaitez inclure des fichiers cachés (dont le nom commence par un point, à l'exception de .et ..) et effectuer également une recherche dans des répertoires cachés, ajoutez le Dqualificatif Globbing:

print -rl -- **/*(.DOL)
Stéphane Chazelas
la source
qu'est-ce que le .OLfait? Est-ce que cela fait partie de la commande?
alpha_989
@ alpha_989, see edit
Stéphane Chazelas
Merci pour l'explication, Stéphane .. Cependant, pour une raison quelconque ... la commande ne fonctionne pas sur mon poste de travail .. J'utilise ls (GNU coreutils) 8.25et zsh 5.1.1 (x86_64-ubuntu-linux-gnu). Est-ce que cela ne fonctionne que pour certaines versions de lset zsh?
alpha_989
@ alpha_989, en quoi cela ne fonctionne-t-il pas pour vous? Cela fonctionne pour moi avec les mêmes versions et il n'y a rien dans ce code qui n'aurait pas fonctionné dans les versions d'il y a au moins 15 ans.
Stéphane Chazelas
9

Lister les fichiers par ordre croissant serait:

ls -lSr

Les options sont:

  • l: long, montre l'utilisateur détaillé, le groupe, d'autres attributs, la date, etc.
  • S: liste des commandes par taille (décroissant par défaut)
  • r: inverse l'ordre de la liste
boulanger
la source
Pourriez-vous expliquer les options pour améliorer la qualité de la réponse?
Rui F Ribeiro
6

Dire que "les fichiers peuvent être présents n'importe où dans un certain dossier" signifie que vous souhaitez redescendre de manière récursive tous les répertoires (dossiers) du répertoire de départ (dossier). C'est ce que l' findon veut faire:

find . -type f -exec ls -lSd {} +

Ceci "trouve" tous les fichiers du répertoire de travail actuel ( .). Pour chaque fichier trouvé, un lsprocessus est exécuté pour trier les objets trouvés par ordre de taille. Le +terminateur à -execprovoque la transmission de plusieurs arguments sous forme de liste ls. À moins que votre répertoire (dossier) ne contienne un très grand nombre de fichiers, vous devriez avoir une liste (et donc un processus branché) aboutissant au résultat souhaité.

JRFerguson
la source
1
c'est bien car cela vous permet d'utiliser le modificateur -h sur ls pour afficher de belles tailles de fichiers
shmish111
4

Affichage de la liste de fichiers dans l'ordre inverse: ls -lSrh

Pour ordre croissant: ls -lSh

utilisateur174839
la source
1
+1 pour utiliser le drapeau -h pour une sortie conviviale.
computingfreak
2

J'ai écrit quelque chose à ce point il y a quelque temps. Vous pouvez passer un argument pour spécifier le nombre de fichiers à répertorier, ou simplement taper big, dans quel cas vous obtenez 10.

big () { 
    NUM_FILES=10;
    if [ $1 ]; then
        NUM_FILES=$1;
    fi;
    du | sort -nr | head -n $NUM_FILES
}
Emanuel Berg
la source
2

Essayez ceux-ci, cela fonctionne bien pour moi.

$ find /home/san -type f -printf '%s %p\n'| sort -nr | head -n 10

# find /root -type f -exec ls -lS {} + | head -n 10 | awk '{ print $5, $9 }'

Pas une réponse parfaite mais fonctionne dans une certaine mesure

$ ls -lS |grep  '^-' | head -n 6 
Sand1512
la source
1
awk fonctionne bien si les noms de fichiers ne contiennent aucun espace.
Eir Nym
oui .. utiliser 'sed' et remplacer l'espace par un trait de soulignement? si cela aide
Sand1512
Non, j'ai l'habitude sedde couper la sortie
Eir Nym
1

Ajout à la réponse de Delh et au commentaire de Stéphane Chazelas ...

find -print0combiné avec xargs -0ajoute le support pour les blancs / espaces / whatnots.

du -h | sort -rn ne trie pas correctement entre différents multiplets d'octets, par exemple 1.1M s'affichera après 128K, ce qui est faux.

sort -rh (--human-numeric-sort) s'en occupe, mais cela ne fonctionne que sur la version de GNU.

Les commandes ci-dessous fourniront le résultat souhaité.

Lisible par l'homme, sur le genre GNU / Linux:

find . -type f -print0 | xargs -0 du -h | sort -rh

En kilo-octets, sous BSD / OSX / autres:

find . -type f -print0 | xargs -0 du -k | sort -rn

Pour BSD / OSX, voir aussi https://unix.stackexchange.com/a/188375/82895 .

djule5
la source
1

En variante de la question initiale, si vous souhaitez voir la taille cumulée des fichiers dans les sous-répertoires:

#!/bin/bash
find ${1:-.} -maxdepth 1 -type d -exec du -sm {} \; | sort -nr

Les tailles seront affichées en mégaoctets (les min du -sm). Les autres valeurs acceptées par dusont les -kkilo-octets et les -ggigaoctets. L'utilisation -hpour un affichage lisible par l'homme n'est pas possible car le tri sera interrompu.

Voici une version qui utilise sedpour ajouter le Mpour le mégaoctet:

find ${1:-.} -maxdepth 1  -type d  -exec du -sm {} \; | sort -nr | sed -E 's/^([0-9]+)/\1M/g'

Le répertoire à afficher est défini via ${1:-.}lequel utilisera le premier argument de ligne de commande s'il est fourni ou utilise le répertoire actuel s'il est appelé sans arguments.

REMARQUE: cela peut prendre beaucoup de temps avec beaucoup de fichiers. Cette option -type dne répertorie que les sous-répertoires et exclut les fichiers du dossier en cours. si vous souhaitez également voir les fichiers du dossier actuel, supprimez-le.

Remarque: vous voudrez peut-être utiliser à la ncduplace ce qui est disponible dans la plupart des dépôts Linux (sur Ubuntu / Debian apt install ncdu) ainsi que sur osx ( brew install ncdu).

ccpizza
la source