Dites à `ls` de trier selon les codes ASCII normaux, et non" intelligemment "

13

J'ai quelques fichiers et les lstrie comme ceci:

a
_b
c

mais je veux avoir

_b
a
c

Comment puis je faire ça?

Martin Ueding
la source
2
Puis-je demander pourquoi?
RolandiXor
2
J'utilise le trait de soulignement pour désigner les répertoires spéciaux qui doivent aller en haut. Dans mon dossier de projets, j'ai des projets proj_a, proj_b et _old_projects. Cela ne sert à rien si ce dossier se trouve dans les o-projets.
Martin Ueding

Réponses:

9

En tant que commande unique, vous pouvez le faire:

LC_COLLATE=C ls

Ou vous pouvez ajouter export LC_COLLATE="C"à votre .bashrc pour le rendre permanent (peut avoir des résultats inattendus triant ailleurs).

Plus d'informations sur les forums Ubuntu .

misterben
la source
1
Je suppose que je vais simplement alias ls avec cela, afin qu'il n'ait pas d'effets secondaires.
Martin Ueding
Ça ne marche pas pour moi. Je reçois ceci -> paste.pocoo.org/show/403333 (c'est l'allemand mais cela ne devrait pas avoir d'importance)
dAnjou
2
@dAnjou LC_COLLATE=Cls définit l'ordre de tri POSIX traditionnel, qui est en ASCII dans lequel les majuscules précèdent le trait de soulignement. Pour que les traits de soulignement soient triés avant les majuscules, vous devez passer sous le capot et créer une définition de paramètres régionaux personnalisée sous / usr / share / i18n / locales.
misterben
2
Cela a peut-être fonctionné dans le passé, mais cela ne fonctionne pas sur Ubuntu 12.04.
Mikel
1
Depuis Ubuntu 14.04, LC_COLLATE=C lsne fonctionne pas, mais LC_ALL=C lsfonctionne.
jwodder
6

Au cas où il n'y aurait pas de méthode intégrée pour ce faire, vous pouvez utiliser un simple remplacement pour sort:

#!/usr/bin/env python

import sys

for i in sorted(sys.stdin):
    sys.stdout.write(i)

Enregistrez-le, par exemple, sur /bin/pysortet rendez-le exécutable ( sudo cp whatever.py /bin/pysortet sudo chmod a+x /bin/pysort), et exécutez-le en tant que ls | pysort:

stefano@lenovo:~/t$ ls | pysort
_b
a
c
Stefano Palazzo
la source
1
Je le mettrais probablement en place ~/binmais une bonne solution de repli. Il est probablement préférable d'utiliser le globbing dans python car la sortie de ls peut être étrange si un nom de fichier contient une nouvelle ligne.
Martin Ueding
1

ls | sortne ferait pas exactement ce dont vous avez besoin?

Philippe De Brouwer
la source
1
non, ça le trie comme "a _b c"
Stefano Palazzo
1
non! et le tri n'a pas non plus d'option pour cela :-)
Rinzwind
2
Il est étrange que le tri ait autant de méthodes de tri spéciales mais pas celle "utiliser la valeur ASCII"…
Martin Ueding