web-dev-qa-db-fra.com

Comment lister tous les fichiers classés par taille

Je voudrais lister tous les fichiers dans l'ordre de grande à petite taille et les fichiers peuvent être présents n'importe où dans un certain dossier.

268
Joe

Utilisez simplement quelque chose comme:

ls -lS /path/to/folder/

Majuscule [~ # ~] s [~ # ~] .

Cela triera les fichiers par taille.

Regarde aussi:

man ls

-S     sort by file size

Si vous voulez trier dans l'ordre inverse , ajoutez simplement -r commutateur.

Mise à jour:

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

ls -lS | grep -v '^d' 

Mise à jour 2:

Je vois maintenant comment il affiche toujours 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 un -. Cela ne devrait laisser que des fichiers réguliers:

ls -lS | grep '^-'

Sur mon système, cela ne montre que les fichiers réguliers.

mise à jour 3:

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

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

-rn signifie Inverse et numérique pour obtenir les plus gros fichiers en haut. L'inconvénient de cette commande est qu'elle n'affiche 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 commande find recherche récursivement tous les fichiers dans tous les sous-répertoires de . et appelez du -h (ce qui signifie utilisation du disque -humanreadable), puis triez à nouveau la sortie. Si votre find/sort ne prend pas en charge -h, remplacer par du -k et sort -rn. Notez que taille et utilisation du disque ne sont pas la même chose.

308
delh

Vous pouvez utiliser quelque chose comme rechercher et trier.

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

(L'option -ls n'est pas standard mais se trouve dans de nombreuses implémentations de recherche, pas seulement dans GNU one. Dans GNU find et autres, il affiche quelque chose de similaire à ls -li à quelques exceptions près, par exemple, les fichiers avec ACL ne sont pas marqués d'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'
26
Mark Cohen

Avec zsh et GNU ls:

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

(.OL) est un qualificatif glob ( , . pour sélectionner les fichiers réguliers uniquement, OL pour inverser l'ordre par longueur (taille du fichier, o pour l'ordre croissant) , O pour décroissant).

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

Certains systèmes d'exploitation ont une limite sur la taille de la liste d'arguments transmise à une commande. Dans ces cas, vous auriez 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, sauf . et ..) et recherchez également dans les répertoires cachés, ajoutez le qualificatif de globalisation D:

print -rl -- **/*(.DOL)
10

La liste des fichiers par taille croissante serait:

ls -lSr

Les options sont les suivantes:

  • l: long, affiche l'utilisateur détaillé, le groupe, les autres attributs, la date, etc.
  • S: liste des commandes par taille (décroissant par défaut)
  • r: inverse l'ordre d'inscription
9
Baker

Dire que "les fichiers peuvent être présents n'importe où dans un certain dossier" implique que vous souhaitiez descendre récursivement tous les répertoires (dossiers) dans le répertoire de départ (dossier). C'est ce que find est censé faire:

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

Cela "trouve" tous les fichiers dans le répertoire de travail courant (.). Pour chaque fichier trouvé, un processus ls est exécuté pour trier les objets trouvés dans l'ordre de taille. Le + terminateur au -exec entraîne 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 bifurqué), conduisant au résultat souhaité.

7
JRFerguson

Essayez-les, 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 
4
Sand1512

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

Pour l'ordre croissant: ls -lSh

4
user174839

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

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

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

find -print0 combiné avec xargs -0 ajoute la prise en charge des blancs/espaces/joyeusetés.

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

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

Les commandes ci-dessous fourniront la sortie souhaitée.

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

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

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

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

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

1
djule5

En variante de la question d'origine, 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 (le m en du -sm). Les autres valeurs acceptées par du sont -k pour les kilo-octets, -g pour les gigaoctets. En utilisant -h pour un affichage lisible par l'homme n'est pas possible car il interrompt le tri.

Voici une version qui utilise sed pour ajouter le M pour 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:-.} qui utilisera le premier argument de ligne de commande s'il est fourni, ou utilisera le répertoire courant s'il est appelé sans arguments.

REMARQUE: cela peut prendre beaucoup de temps avec de nombreux fichiers. L'option -type d répertorie uniquement les sous-répertoires et exclut les fichiers du dossier actuel; si vous souhaitez également voir les fichiers dans le dossier en cours, supprimez-le.

Remarque: vous voudrez peut-être utiliser ncdu à la place, qui est disponible dans la plupart des dépôts linux (sur ubuntu/debian apt install ncdu) ainsi que sur osx (brew install ncdu).

1
ccpizza