web-dev-qa-db-fra.com

Pourquoi la commande `ls` trite-t-elle des fichiers comme celle-ci?

Comme j'essayais d'inverser l'ingénieur, la commande LS, je suis tombé sur un comportement intéressant. Quand je fais 3 fichiers, foo.png, foopa.png, et fooqa.png, LS les trite comme foopa.png, foo.png, et fooqa.png. Je l'ai également essayé à l'aide de l'extension .gif et il semble que cela se produise lorsque P et Q sont remplacés par la première lettre de l'extension et la lettre suivante de l'alphabet; Donc, dans le cas de .g si ce serait g et h. (fooga.gif, ensuite foo.gif, ensuite fooha.gif)

Pourquoi ordonne-t-il la sortie de cette façon?

34
mooncat39

Cela dépend de l'ordre de rassemblement de votre région:

>LANG=en_IE.UTF-8 ls -1 foo*
foopa.png
foo.png
fooqa.png

>LANG=C ls -1 foo* 
foo.png
foopa.png
fooqa.png

Vous pouvez également utiliser la variable LC_COLLATE au lieu de Lang et utilisez le paramètre local POSIX au lieu du C ONE.

C ordre de classement est purement alphabétique (ordre ASCII). Les autres ordres de collation (tels que l'anglais) peuvent envisager des espaces et des caractères spéciaux tels que des points de séparateur et des "mots" séparément, soit simplement ignorer ces séparateurs (ce qui semble être le cas ici).

Notez que les paramètres régionaux non-UTF-8 utilisent également l'ASCII alphabétique:

>LANG=en_IE ls -1 foo*
foo.png
foopa.png
fooqa.png

Après plus de creusement, il apparaît que l'ignorance de la ponctuation est une caractéristique commune des locals de l'Unicode, tels que le *.UTF-8 celles.

53
xenoid