Je cherche à lister tout le contenu d'un répertoire, y compris le contenu des sous-dossiers mais trié par la taille du fichier. Jusqu'ici, j'ai réussi à aller aussi loin que la liste et le tri tout en restant récursif avec ls -lhSR
(le h
est bien d'avoir mais il n'est certainement pas essentiel pour moi, tant que je peux obtenir la taille des fichiers). Je suis probablement en train de négliger quelque chose d'évident ou de demander l'impossible, mais tout conseil serait grandement apprécié.
Vous pouvez utiliser trouver:
find . -type f -printf "%s %P\n" | sort -n
Facultatif: pour convertir les valeurs d'octet au format lisible par l'homme, ajoutez ceci:
| numfmt --to=iec-i --field=1
Explication:
find in current directory (.) all files (-type f)
-printf: suppress normal output and print the following:
%s - size in bytes
%P - path to file
\n - new line
| sort -n: sort the result (-n = numeric)
Puisque vous n'avez pas spécifié de shell particulier, voici une alternative utilisant les qualificateurs globaux de zsh avec
setopt extendedglob
pour la récursion. Alors par exemple:
liste récursivement les fichiers simples:
printf '%s\n' **/*(.)
liste récursivement les fichiers simples, o ordonné par dans se plissant L ength (taille) :
printf '%s\n' **/*(.oL)
liste récursivement les fichiers simples, O ordonné par de taille plissante:
printf '%s\n' **/*(.OL)
liste récursivement les fichiers simples, classés par ordre décroissant de taille, et sélectionne les 3 premiers résultats:
printf '%s\n' **/*(.OL[1,3])
Si vous voulez aussi la taille des fichiers, vous pouvez utiliser
du -hb **/*(.OL[1,3])
Avec le jeu d'options globstar
Shell, vous pouvez utiliser le globbing de shell:
shopt -s globstar # don’t match hidden files
shopt -s globstar dotglob # match hidden files
stat -c"%s %n" **/* | sort -n
Si vous essayez avec trop de fichiers, vous obtiendrez l’erreur "Liste des arguments trop longue". Pour contourner ce problème, vous pouvez utiliser printf
et xargs
:
printf "%s\0" **/* | xargs -0 stat -c"%s %n" | sort -n
Je viens de me rendre compte que cela imprimait aussi les répertoires (avec une taille de 4096 octets) - si vous ne le souhaitez pas, utilisez plutôt ceci:
stat -c"%A %s %n" **/* | sed '/^d/d;s/\S* //' | sort -n
printf "%s\0" **/* | xargs -0 stat -c"%A %s %n" | sed '/^d/d;s/\S* //' | sort -n
$ tree
.
├── edits.png
├── makescript
├── new
│ └── edits.png
└── test
└── 1.png
2 directories, 4 files
$ stat -c"%s %n" **/* | sort -n
0 test/1.png
43 makescript
2160 edits.png
2160 new/edits.png
4096 new
4096 test
$ stat -c"%A %s %n" **/* | sed '/^d/d;s/\S* //' | sort -n
0 test/1.png
43 makescript
2160 edits.png
2160 new/edits.png
Si vous n'avez pas zsh, vous pouvez toujours utiliser du
+ sort
:
Tailles lisibles par l'homme, y compris les tailles cumulatives de répertoires:
du --apparent-size -ah0 . | sort -zh | xargs -0L1
Seulement les fichiers (en utilisant find
):
find . -type f -print0 |
du --files0-from=- --apparent-size -ah0 |
sort -zh |
xargs -0L1
Dans les deux cas, j'ai choisi d'utiliser des lignes à terminaison nulle (options -0
, -z
, -print0
), afin de protéger tous les noms de fichiers valides.
Pour une utilisation interactive rapide sur les arborescences de répertoires qui ne sont pas trop énormes, shopt -s globstar
est vraiment sympa. Un glob ne peut pas filtrer les répertoires basés sur le type, mais si vous l'utilisez avec ls -d
, alors ls
affichera simplement le nom du répertoire au lieu de son contenu.
En supposant que votre alias ll
inclut -lh
:
# with shopt -s globstar in your .bashrc
ll -rSd **/*
vous donnera une sortie comme celle-ci (de mon répertoire code-golf), mais avec une coloration en couleur (il est donc plus facile de voir les répertoires). Notez que le tri par taille de fichier a eu lieu entre les sous-répertoires.
drwxr-xr-x 1 peter peter 70 Jun 8 07:56 casexchg
...
drwxr-xr-x 1 peter peter 342 Mar 13 18:47 parity-party
-rw-r--r-- 1 peter peter 387 Jul 29 2017 likely.cpp
-rw-r--r-- 1 peter peter 416 Aug 31 2017 true-binary.asm~
-rw-r--r-- 1 peter peter 447 Feb 23 20:14 weight-of-zero.asm
...
-rw-r--r-- 1 peter peter 6.4K Jun 1 2017 string-exponential.asm
-rwxr-xr-x 1 peter peter 6.7K Aug 31 2017 true-binary
-rwxr-xr-x 1 peter peter 6.8K Sep 17 2017 dizzy-integer
-rw-r--r-- 1 peter peter 7.5K Jul 24 2017 fibonacci/fibonacci-1G.v3-working-32b-stack-except-output.asm
-rw-r--r-- 1 peter peter 8.4K Jul 25 2017 fibonacci/perf.32bit-pop-114limb.sub-cmc.1G~
-rw-r--r-- 1 peter peter 8.4K Jul 25 2017 fibonacci/perf.32bit-pop-114limb.sub-cmc.1G
-rwxr-xr-x 1 peter peter 8.4K May 19 04:29 a.out
-rw-r--r-- 1 peter peter 8.9K Jul 25 2017 fibonacci/perf.python-xnor-2n
-rw-r--r-- 1 peter peter 9.5K Jul 26 2017 fibonacci/fibonacci-1G-performance.asm
-rwxr-xr-x 1 peter peter 9.6K Apr 12 23:25 empty-args
-rw-r--r-- 1 peter peter 9.7K Dec 18 17:00 bubblesort.asm
-rwxr-xr-x 1 peter peter 9.9K Feb 6 23:34 parity-party/a.out
-rw-r--r-- 1 peter peter 9.9K Jul 25 2017 fibonacci/fibonacci-1G-performance.asm~
...
Vous pouvez filtrer les répertoires en passant par grep -v '^d'
Vous pouvez parfois utiliser un glob qui correspond uniquement à des fichiers et non à des répertoires, si vos noms de fichiers ont un motif. par exemple. ll -rSd **/*.jpg
, ou même **/*.*
fonctionne si aucun des noms de vos répertoires ne contient .
et tous les fichiers que vous souhaitez font .
(Pour les personnes ayant un fond DOS: rien de magique à propos de *.*
sous Unix. Cela correspond à toute entrée de répertoire contenant un point littéral. Mais, à l'exception des exécutables et parfois des fichiers texte, il est courant de donner des extensions aux noms de fichiers.)
@dessert indique que vous auriez besoin de shopt -s dotglob
pour correspondre à tous les fichiers .
find
S'il n'y a pas trop de fichiers à contenir sur une ligne de commande ls
, find -exec ls {} +
les mettra tous sur la ligne de commande, où ls
peut les trier.
find -not -type d -exec ls --color -lrSh {} +
L'utilisation de -not -type d
au lieu de -type f
évite d'ignorer les liens symboliques, les canaux nommés, les sockets, les fichiers de périphériques et tout ce que vous avez dans vos répertoires.
du
:du -ach | sort -h
....
4.0K x86-modedetect-polyglot.o
8.0K ascii-compress-base.asm
8.0K dizzy-integer
8.0K stopwatch-rdtsc.asm
8.0K string-exponential.asm
8.0K true-binary
12K a.out
12K bubblesort.asm
12K casexchg
12K empty-args
100K parity-party
220K fibonacci
628K total
Maintenant, les noms de répertoire sont triés dans la liste avec la somme totale de tout leur contenu, mais des fichiers individuels sont toujours inclus.
sort -h
, alias --human-numeric-sort
, trie les nombres avec des suffixes de taille tels que du -h
imprime. C'est parfait pour une utilisation avec du
.
J'utilise souvent du -sch * | sort -h
ou */
pour obtenir uniquement des répertoires.
du -sch **/* | sort -h
vous donnerait le résultat ci-dessus, si vous oubliez que du
a une option -a
.
(J'ai seulement pris le temps de chercher, car je poste une réponse. Pour une utilisation interactive, j'aurais probablement utilisé du -sch **/*
.