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.
man ls
:-S sort by file size
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.
man ls
:-S sort by file size
Réponses:
Utilisez simplement quelque chose comme:
ls -lS /path/to/folder/
Capital S .
Cela va trier les fichiers par taille.
Regarde aussi:
-S sort by file size
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):
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 sort
commande 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. 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 find
commande 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
/ sort
ne supporte pas -h
, remplacez par du -k
et sort -rn
. Notez que la taille et l'utilisation du disque ne sont pas la même chose.
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.
find . -type f -ls | sort -r -n -k7
(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:
find . -type f -ls -printf '\0' | sort -zk7rn | tr -d '\0'
Avec zsh et GNU ls:
ls -ldU -- **/*(.OL)
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 ordre O
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:
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 D
qualificatif Globbing:
print -rl -- **/*(.DOL)
.OL
fait? Est-ce que cela fait partie de la commande?
ls (GNU coreutils) 8.25
et zsh 5.1.1 (x86_64-ubuntu-linux-gnu)
. Est-ce que cela ne fonctionne que pour certaines versions de ls
et zsh
?
Lister les fichiers par ordre croissant serait:
ls -lSr
Les options sont:
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:
find . -type f -exec ls -lSd {} +
Ceci "trouve" tous les fichiers du répertoire de travail actuel ( .
). Pour chaque fichier trouvé, un ls
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 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é.
Affichage de la liste de fichiers dans l'ordre inverse: ls -lSrh
Pour ordre croissant: ls -lSh
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
}
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
sed
de couper la sortie
Ajout à la réponse de Delh et au commentaire de Stéphane Chazelas ...
find -print0
combiné avec xargs -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 .
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 m
in du -sm
). Les autres valeurs acceptées par du
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 le M
pour 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 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.
Remarque: vous voudrez peut-être utiliser à la
ncdu
place ce qui est disponible dans la plupart des dépôts Linux (sur Ubuntu / Debianapt install ncdu
) ainsi que sur osx (brew install ncdu
).