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.
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?
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:
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)
Où (.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:
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)
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é.
+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
}
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).
man ls
:-S sort by file size
Réponses:
Utilisez simplement quelque chose comme:
Capital S .
Cela va trier les fichiers par taille.
Regarde aussi:
man ls
Si vous souhaitez trier dans l' ordre inverse , ajoutez simplement
-r
switch.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):
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: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
sort
commande et lui dirais d'utiliser la 5ème colonne pour trier.-rn
signifie 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:
La
find
commande trouvera de manière récursive tous les fichiers dans tous les sous-répertoires de.
et appelleradu -h
(ce qui signifie utilisation du disque -humanreadable ), puis triera à nouveau la sortie. Si votrefind
/sort
ne supporte pas-h
, remplacez pardu -k
etsort -rn
. Notez que la taille et l'utilisation du disque ne sont pas la même chose.la source
du
donne 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’-h
option 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.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
.+ |
syntaxe dans+ | sort -r -h
?Vous pouvez utiliser quelque chose comme rechercher et trier.
(l'
-ls
option 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 -li
quelques 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:
la source
Avec zsh et GNU ls:
Où
(.OL)
est un qualificatif glob ,.
pour sélectionner uniquement les fichiers normaux ,OL
pour inverser l’ordre par longueur (taille du fichier,o
par ordre croissant, par ordreO
dé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:
Si vous voulez juste la liste des fichiers et non la sortie détaillée, faites simplement:
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 leD
qualificatif Globbing:la source
.OL
fait? Est-ce que cela fait partie de la commande?ls (GNU coreutils) 8.25
etzsh 5.1.1 (x86_64-ubuntu-linux-gnu)
. Est-ce que cela ne fonctionne que pour certaines versions dels
etzsh
?Lister les fichiers par ordre croissant serait:
Les options sont:
la source
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'
find
on veut faire:Ceci "trouve" tous les fichiers du répertoire de travail actuel (
.
). Pour chaque fichier trouvé, unls
processus est exécuté pour trier les objets trouvés par ordre de taille. Le+
terminateur à-exec
provoque la transmission de plusieurs arguments sous forme de listels
. À 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é.la source
Affichage de la liste de fichiers dans l'ordre inverse:
ls -lSrh
Pour ordre croissant:
ls -lSh
la source
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.la source
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
la source
sed
de couper la sortieAjout à la réponse de Delh et au commentaire de Stéphane Chazelas ...
find -print0
combiné avecxargs -0
ajoute 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 .
la source
En variante de la question initiale, si vous souhaitez voir la taille cumulée des fichiers dans les sous-répertoires:
Les tailles seront affichées en mégaoctets (les
m
indu -sm
). Les autres valeurs acceptées pardu
sont les-k
kilo-octets et les-g
gigaoctets. L'utilisation-h
pour un affichage lisible par l'homme n'est pas possible car le tri sera interrompu.Voici une version qui utilise
sed
pour ajouter leM
pour le mégaoctet: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 d
ne 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.la source