Les 'ls' d'Unix triés par nom

127

Pouvez-vous trier une liste ls par nom?

Devang Kamdar
la source
10
S'il ne trie pas par nom sans aucun argument, vous voudrez peut-être vérifier si ls a été aliasé sur quelque chose d'autre, ou simplement l'invoquer en utilisant le chemin complet qui éliminerait tous les alias existants.
tvanfosson
gnu-coreutils ls trie par défaut. Quel système utilisez-vous (comme d'autres l'ont demandé)
Nick Fortescue
Êtes-vous sûr que vous demandez de trier par nom et non par type (c.-à-d. Répertoire d'abord puis fichiers) ??
Curtisk
Les majuscules viennent avant les minuscules, donc le fichier Z vient avant le fichier a ... comment puis-je résoudre ce problème?
ArtOfWarfare
La page de manuel indique «triés séparément et dans l'ordre lexicographique». Les fichiers sont triés en fonction du premier caractère: numérique [0..9] et caractères UPPER [A..Z] et lowe caractères [a..z]
Gürol Canbek

Réponses:

131

Mon ls trie par nom par défaut. Que vois-tu?

man ls États:

List information about the FILEs (the current directory by default). Sort entries alpha‐betically if none of -cftuvSUX nor --sort is specified.:

Evert
la source
lsne trie pas si -c1spécifié: y a-t-il un moyen de le faire? ( --sort=namene semble pas fonctionner)
dhc
1
Ce n'est pas vrai. avec ls -la, je vois .bashrc - can - .config - Downloads - .local - tmp.bashrc - .config - .local - Downloads - can - tmp
:,
1
le mien dit que 100.jpg vient avant 10.jpg. C'est logique, je suppose que si "0" précède "." mais ce n'est toujours pas intuitif
chiliNUT
Je vois "M" avant "b". Confus. Attendez, la capitalisation est-elle importante?
Daniel Springer
106

Pour quelque chose de simple, vous pouvez combiner ls avec sort . Pour juste une liste de noms de fichiers:
ls -1 | Trier

Pour les trier dans l'ordre inverse:
ls -1 | trier -r

marque
la source
3
Existe-t-il un moyen de trier les fichiers comme ceci: ls | sort -n 1.1.1; 1.1.2; 1.1.3; 2.10.1; 2.10.15; 2.10.2; 2.10.20; 2.10.21; 2.1.1; 2.1.10; 2.1.15; 2.1.2; 2.1.3; 2.1.4; 10.1.1; 10.1.2; 10.1.3; 11.0.1; 11.0.2; 11.0.20; 11.0.21; 11.0.22; Comme vous pouvez le voir 2.10.15 avant 2.10.2 .
BBK
Je fais du développement Android sur un appareil Pidion, et ls ne trie pas automatiquement, donc cela a été très utile! Le seul problème est qu'il semble qu'il trie les liens souples mais ne trie pas les fichiers, pour une raison quelconque
Mitch
Sur Mac, il semble que cette deuxième commande puisse être raccourcie en ls -1r.
Ash Ryan Arnwine
4
@BBK sort -V triera par numéro de version, donc vous obtenez .. 2.10.2; 2.10.15; .. from man sort .. --sort = WORD triera selon WORD: general-numeric -g, human-numeric -h, month -M, numeric -n, random -R, version -V
mosh
35

lsfrom coreutilseffectue un tri sensible aux paramètres régionaux par défaut, et peut donc produire des résultats surprenants dans certains cas (par exemple, %footriera entre baret quuxdans LANG=en_US). Si vous voulez un tri ASCIIbétique, utilisez

LANG=C ls
Richard Smith
la source
LANGilfnuence le comportement de tri, ce post m'aide beaucoup!
yurenchen
Cela a fonctionné pour moi aussi. Pouvez-vous développer? Pourquoi le tri est-il différent?
Kostas
1
Cette dose fonctionne, mais la sortie ?pour chaque caractère non-ascii lorsque la sortie est un terminal (une mauvaise fonctionnalité de ls vérifie si elle est sortie vers un terminal, fonctionne lors de la tuyauterie). Vous pouvez "corriger" cela avec un piping vers cat, utiliser la C.UTF-8locale (si votre système le prend en charge) et / ou utiliser l' -bindicateur. Mieux encore, ne pas utiliser lsdu tout, mieux utiliser `
12431234123412341234123
Cela m'a aidé à découvrir que pour moi, le problème était que certains de mes noms de fichiers contenaient un tiret (-), et d'autres un tiret en (-). lstrie les tirets avant les tirets.
Jamy Mahabier le
17

La beauté des outils * nix est que vous pouvez les combiner:

ls -l | sort -k9,9

La sortie de ls -lressemblera à ceci

-rw-rw-r-- 1 luckydonald luckydonald  532 Feb 21  2017 Makefile
-rwxrwxrwx 1 luckydonald luckydonald 4096 Nov 17 23:47 file.txt

Donc, avec 9,9vous triez la colonne 9jusqu'à la colonne 9, étant les noms de fichiers. Vous devez indiquer où vous arrêter, qui est la même colonne dans ce cas. Les colonnes commencent par1 .

De plus, si vous souhaitez ignorer les majuscules / minuscules, ajoutez --ignore-caseà la commande de tri.

utilisateur491575
la source
1
Que veut -k9,9dire?
luckydonald
Trouvé, cela signifie trier la colonne 9jusqu'à la même colonne 9. Une lssortie normale ressemble à ceci drwx------ 8 999 user 4.0K Feb 5 2017 file.txt:, donc la colonne 9 étant les noms de fichiers. Si vous souhaitez ignorer la casse, utilisez --ignore-casesur tri.
luckydonald
8

AVIS: "a" vient APRÈS "Z":

$ touch A.txt aa.txt Z.txt

$ ls

A.txt Z.txt aa.txt

russian_spy
la source
3
Ce n'est pas toujours vrai. Je ne connais pas exactement les circonstances qui rendent cela faux, mais sur ma machine exécutant Ubuntu 12.04, la sortie de ls est triée par ordre alphabétique (en ignorant la casse).
Patrick James McDougle
Bonne prise! On dirait qu'il le commande en fonction du code ASCII. Les alphabets en majuscules sont suivis de minuscules ..
Kent Pawar
1
J'ai remarqué que mon MacOS triait les premiers chiffres, puis les lettres majuscules, puis les traits de soulignement, puis les lettres minuscules. C'est drôle qu'ils ne soient pas sensibles à la casse. D'un autre côté, mon Debian est sensible à la casse mais il trie les lettres de manière insensible à moins qu'il n'y ait une égalité, alors les minuscules l'emportent! Exemple: ABA.txt ABb.txt aBC.txt AbC.txt ABc.txt
zk82
Je suis aussi sur un MAC. J'ai été déçu de voir le type de tri A, Z, a, z. Je suis ici parce que je préfère avoir A, a, Z, a. merci pour votre conseil. va essayer les normalsolutions ici.
nyxee
8

Les fichiers n'étant différents que par une chaîne numérique peuvent être triés sur ce numéro à la condition qu'il soit précédé d'un séparateur.

Dans ce cas, la syntaxe suivante peut être utilisée:

ls -x1 file | sort -t'<char>' -n -k2

Exemple:

ls -1 TRA*log | sort -t'_' -n -k2

TRACE_1.log
TRACE_2.log
TRACE_3.log
TRACE_4.log
TRACE_5.log
TRACE_6.log
TRACE_7.log
TRACE_8.log
TRACE_9.log
TRACE_10.log
poney
la source
4

Depuis la page de manuel (pour bash ls):

Triez les entrées par ordre alphabétique si aucune de -cftuSUX ni --sort.

jwoolard
la source
3
Il n'y a pas de "bash ls". Faites "which ls"
Norbert Hartl
@Norbert: Vous avez raison, mais which lsréussirait même si bash avait un ls intégré. builtin lsFaites plutôt en bash et obtenez une erreur.
Pianosaurus
4
@Norbert: which renvoie toujours un chemin. Permet type lsde déterminer ce que pense le shell ls(intégré, fonction, exécutable).
éphémère
3

L' lsutilitaire doit être conforme à la norme IEEE 1003.1-2001 ( POSIX.1) qui stipule:

22027: il doit trier les opérandes de répertoire et de non-répertoire séparément selon la séquence de classement dans la locale courante.

26027: Par défaut, le format n'est pas spécifié, mais la sortie doit être triée par ordre alphabétique par nom de symbole:

  • Nom de la bibliothèque ou de l'objet, si −A est spécifié
  • Nom du symbole
  • Type de symbole
  • Valeur du symbole
  • La taille associée au symbole, le cas échéant
Kenorb
la source
2

Vérifiez votre .bashrcfichier pour les alias.

Sujit
la source
7
On pourrait simplement taper aliaspour vérifier tous les alias actuels.
Krzysztof Jabłoński
2

ls -X fonctionne dans ce but, au cas où vous auriez un alias ls avec une valeur par défaut plus utile.

jezzo
la source
0
In Debian Jessie, this works nice:

ls -lah --group-directories-first

# l=use a long listing format
# a=do not ignore entries starting with .
# h=human readable
# --group-directories-first=(obvious)
# Note: add -r for reverse alpha

# You might consider using lh by appending to ~/.bashrc as the alias:
~$ echo "alias lh='ls -lah --group-directories-first'" >>~/.bashrc
# -- restart your terminal before using lh command --
James T
la source