Je cherche essentiellement des fichiers, puis je trie par taille. Le script fonctionne si je ne trie pas la taille par lisible par l'homme. Mais je veux que la taille soit lisible par l'homme. Comment trier des tailles lisibles par l'homme?
Par exemple:
ls -l | sort -k 5 -n | awk '{print $9 " " $5}'
Cela fonctionne comme prévu, j'ai la taille de mes fichiers en octets croissante:
1.txt 1
test.txt 3
bash.sh* 573
DocGeneration.txt 1131
andres_stuff.txt 1465
Branches.xlsx 15087
foo 23735
bar 60566
2016_stuff.pdf 996850
Maintenant, je veux que la taille soit lisible par l'homme, j'ai donc ajouté un paramètre -h à ls, et maintenant certains fichiers sont hors service:
ls -lh | sort -k 5 -n | awk '{print $9 " " $5}'
1.txt 1
DocGeneration.txt 1.2K
andres_stuff.txt 1.5K
test.txt 3
Branches.xlsx 15K
foo 24K
bar 60K
bash.sh* 573
2016_stuff.pdf 974K
-k 5
- Comment ça marche?ls
sortiedu
au lieu dels
pourrait être une bonne idée.find
« s-printf
avec son%p
et%s
formatteurs (suivie d'une « humanisation » des tailles).Réponses:
Essayer
sort -h k2
Cela fait partie du tri gnu, du tri BSD et autres.
la source
ls
?ls
et utiliser à la place la globalisation de fichiers directement. Globbing seul ne fonctionnera pas ici. Cela dit, je préférerais probablementdu
cela.files=(); for f in *; do [[ -L "$f" ]] && files+=("$f"); done; echo ${#files[@]}
(Je pourrais avoir un commutateur de test de lien symbolique incorrect). Si vous ne vous souciez pas des liens symboliques,files=(*); echo ${#files[@]}
qui devient portable si vous utilisezset
et non des tableaux.ls
a cette fonctionnalité intégrée, utilisez l'-S
option et triez dans l'ordre inverse:ls -lShr
la source
-h
n'est pas une option standardls
, mais doit être utilisable si OP l'a déjà. Le reste est standard, et c'est certainement la réponse que j'aurais écrite.ls
.-S
peut-être pas disponible pour votrels
. FWIW,-S
est pris en charge même avec la bibliothèque d'Emacsls-lisp.el
, qui est utilisée lorsque le système d'exploitation n'a pasls
. Cela fonctionne par exemple dans Emacs sur MS Windows.-h
n'est peut-être pas universellement disponible, mais OP l'utilise déjà de toute façon. devrait-S
vraiment être universellement disponible, car c'est dans le lien POSIX que Toby fournit. Cependant, il existe de nombreuses boîtes à outils non POSIX.Puisqu'aucun shell spécifique n'a été mentionné, voici comment faire le tout dans le
zsh
shell:Le
**
modèle de glob correspond à*
mais/
dans les chemins d'accès, c'est-à-dire comme le ferait une recherche récursive.La
ls
commande activerait les tailles lisibles par l'homme avec-h
et le format de sortie de longue liste avec-l
. L'-f
option désactive le tri, ills
suffit donc de répertorier les fichiers dans l'ordre où ils sont donnés.Cet ordre est organisé par le
**/*(.Lk-1024oL)
modèle de globbing de nom de fichier afin que les petits fichiers soient répertoriés en premier. Le**/*
bit correspond à chaque fichier et répertoire de ce répertoire et ci-dessous, mais(...)
modifie le comportement du glob (c'est un "qualificatif glob").C'est
oL
à la fin que trie (o
) les noms par taille de fichier (L
, "longueur").Au
.
début, le glob ne correspond qu'aux fichiers normaux (pas de répertoires).Le
Lk-1024
bit sélectionne les fichiers dont la taille est inférieure à 1024 Ko ("longueur en Ko inférieure à 1024").Si ce
zsh
n'est pas votre shell interactif principal, vous pouvez utiliserUtilisez
setopt GLOB_DOTS
(ouzsh -o GLOB_DOTS -c ...
) pour faire correspondre également les noms masqués. ... ou ajoutez simplementD
à la chaîne de qualificatif glob.En développant ce qui précède, en supposant que vous souhaitiez une sortie à 2 colonnes avec des noms de chemin et des tailles lisibles par l'homme, et en supposant également que vous disposez
numfmt
de GNU coreutils,ou, plus vite,
la source
Si votre
sort
n'a pas l'-h
option, vous pouvez utiliser une commande awk (bien que très longue) comme la suivante:Cela triera votre sortie en octets, puis les convertira à leur taille lisible par la suite.
la source
Est-ce que cela fonctionnerait?
La première
awk
exp recherchera les fichiers inférieurs à 1 Mo et la seconde prendra la taille en octets du résultat et la convertira en Ko et imprime les 3 premiers éléments pour donner une taille lisible par l'homme.la source