Tri LS insensible à la casse dans Mac OSX

30

Comment puis-je faire en sorte que la lscommande dans Max OS X Lion trie les fichiers et les répertoires de la même manière que Ubuntu Linux (insensible à la casse, répertoires PAS en haut, fichiers en points PAS en haut)? Idéalement, je voudrais le faire sans canaliser la sortie vers une autre commande telle que sort.

Par exemple, je veux voir:

foo
Foobar
MyStuff/
.stuff/
test.txt

au lieu de:

.stuff
Foobar
MyStuff/
foo
test.txt

Sous Linux, l' lsordre de tri est spécifiquement contrôlé par les paramètres régionaux du système LC_COLLATE. Quand LC_COLLATE=en_US.UTF-8, ls triera les éléments comme je le souhaite. Quand LC_COLLATE=C, lssera similaire à OS X.

LC_COLLATEest défini sur en_US.UTF-8OS X, mais lstrie toujours à l'ancienne POSIX. Est-ce que quelqu'un sait comment je peux faire en sorte que cela se comporte plus comme Linux?

Emil
la source
Si cela aide: apple.stackexchange.com/a/22304/8546 observe que HFS Plus est généralement configuré pour être insensible à la casse mais en préservant la casse .
Graham Perrin

Réponses:

16

Cela pourrait ne pas être possible:

En examinant le code source de ls , il utilise strcoll pour trier les noms de fichiers et doit donc respecter LC_COLLATE.

Certaines publications en ligne suggèrent que les paramètres régionaux de BSD (et Darwin / OS X) sont quelque peu cassés par rapport à ceux de Linux. J'ai écrit moi-même un programme de tri rapide qui définit explicitement ses paramètres régionaux et le teste en utilisant les paramètres régionaux en_US.UTF-8 et C sur ma machine (Mac OS 10.6.3) et une machine universitaire (Linux, FC11?). Alors que le tri fonctionne comme prévu sur la machine Linux, ("a B c" vs "B a c"), le mac les trie toujours comme "B a c".

Source: http://ask.metafilter.com/130292/CaseInsensitive-LS-on-Mac-OS-X

RÉPONSE ORIGINALE

Cette commande ne trie pas les fichiers de points, mais affiche des listes de répertoires supplémentaires

ls -f1 

Je me suis approché de ça:

.
..
.stuff
foo
Foobar
MyStuff
test.txt
Sairam
la source
1
Il est intéressant de noter que "désactiver le tri" avec l'option -f semble réellement le trier comme prévu. Je suppose que ce sont les entrées de tri du système de fichiers / HFS + avec un classement plus "naturel".
Gerry
6

Je sais que cela a été répondu, mais cela fonctionne mieux pour moi:

ls -f1 -alF -G

Il répertorie tous les détails et les trie en ignorant la casse.

Jared Burrows
la source
4

Cela me dérange depuis un certain temps maintenant, et je l'ai finalement trié (heh). Après avoir essayé un tas de suggestions qui n'ont pas fonctionné, voici ce qui a fonctionné.

Si vous êtes prêt à installer MacPorts (ou Homebrew ou Fink), la version GNU de ls fait exactement ce que vous voulez. J'utilise MacPorts moi-même, c'est donc l'approche que je vais expliquer:

  1. Téléchargez et installez MacPorts:

    http://www.macports.org

  2. Installez le paquet GNU Coreutils:

    sudo port install coreutils

  3. Vous devriez maintenant avoir ls GNU: gls. Essayez-le dans un répertoire contenant des éléments commençant par des majuscules et des minuscules:

    gls -U

    (L' -Uoption signifie en fait "non trié", mais sur OS X, cela a l'effet souhaité de le rendre insensible à la casse.)

  4. Ajoutez cet alias dans votre .bash_profileafin que le régulier lsfonctionne comme vous le souhaitez (j'aime la sortie couleur, mais vous pouvez l'omettre si vous le souhaitez; vous n'avez besoin que de -U):

    alias ls='gls -U --color'

Notez que l' -Uoption ne fonctionnera probablement pas sur d'autres plates-formes. Dans OS X, il semble toujours faire la bonne chose (peut-être parce que HFS + est effectivement insensible à la casse - "sensible à la casse", techniquement), mais si vous l'essayez sur une boîte Linux, les résultats ne seront probablement pas triés du tout.

Jason Sims
la source
1
3. ne semble plus avoir l'effet secondaire souhaité (option -U) sous macOS> = 10.13 en raison du nouvel APFS.
Marius Hofert
1
Oui… il ne semble pas qu'il y ait moyen de le faire avec APFS.
Jason Sims
Confirmez que cela fonctionne le 10.12. Merci!
Colonel Panic,
4

En ajoutant à ce que Mike a écrit ci-dessus, je suis allé un peu plus loin et j'ai trouvé un moyen de définir vos propres règles de classement.

Les définitions de paramètres régionaux se trouvent dans / usr / share / locale /. Chaque dossier est un environnement local et possède un fichier (ou un lien) LC_COLLATE, qui définit quels symboles sont "identiques" (par exemple, que U, u et ü doivent être considérés comme les mêmes lors de la commande). Vous pouvez dupliquer un répertoire et cela créera une nouvelle définition de paramètres régionaux:

$ sudo cp -R en_GB.UTF-8/ en_GB.UTF-8-CI/

Vous allez maintenant avoir une nouvelle locale appelée 'en_GB.UTF-8-CI' ('CI' pour la casse) et vous pouvez utiliser LC_COLLATE à partir de là.

Maintenant, pour changer LC_COLLATE dans les nouveaux paramètres régionaux, vous pouvez télécharger les sources de paramètres régionaux à partir de http://www.opensource.apple.com/source/adv_cmds/adv_cmds-119/usr-share-locale.tproj/colldef/ , modifiez celui-ci qui est le plus proche de ce que vous voulez et exécutez

$ colldef < <new collation file>
$ sudo cp LC_COLLATE /usr/share/locale/en_GB.UTF-8-CI/

et maintenant quand tu cours

$ LC_COLLATE=en_GB.UTF-8-CI ls

vous aurez un tri selon vos règles.

Oui, c'est ce qu'il faut pour rendre le tri «ls» insensible à la casse.

Dmitry
la source
2

Pour contourner ce problème, vous pouvez utiliser une fonction et un alias:

function lssorted() { /bin/ls "$@" | sort -f ;}
alias ls='lssorted'

Cela produit une sortie triée de manière insensible à la casse pour la commande ls standard.

Arne
la source
1
Je dois noter: cela échouera si par exemple -l est utilisé. Puis ls produit une autre ligne "total X" au début, qui sera également triée.
Arne
2

En utilisant

ls -f

travaille pour moi.

-f désactive officiellement tout tri, mais il semble que le tri HFS d'origine soit visible, ce qui est exactement un tri non sensible à la casse.

Je suppose que cela dépend en fait de savoir si vous avez votre format HD sensible à la casse ou non, mais comme le format HFS sensible à la casse est la valeur par défaut pour les disques système Mac OS X, cela devrait fonctionner pour la majorité des utilisateurs.

Jpsy
la source
C'est certainement la bonne réponse. Le seul problème avec cela est qu'il active implicitement également -a, et il n'y a aucun moyen de le désactiver, ce qui vous montrera les fichiers / dossiers commençant par un point, y compris. et .. .
lensovet
1
L'autre problème (maintenant) est que cela ne semble plus fonctionner sous macOS> = 10.13 en raison du nouvel APFS.
Marius Hofert
1

Inspiré par la réponse de Mike, j'ai ajouté ce qui suit à / etc / bashrc, et cela fonctionne à merveille dans Mojave. Il répertorie les fichiers cachés à la fin lorsque -a est ajouté, mais cela ne me dérange pas.

export LC_COLLATE="cs_CZ.ISO8859-2"; alias ls='ls -lhFG'

Vous pouvez voir la nouvelle configuration en exécutant la commande locale. Pour revenir, supprimez simplement la ligne de / etc / bashrc et reconnectez-vous au terminal.

$ locale
LANG="en_US.UTF-8"
LC_COLLATE="cs_CZ.ISO8859-2"
LC_CTYPE="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_ALL=

Notez que ni ls -f1 ni ls -f ne fonctionnaient pour moi à Mojave. Je me suis retrouvé avec une liste vraiment non triée. Seule la solution que j'ai fournie a fonctionné pour moi à Mojave.

Jer
la source
La meilleure réponse, mais l'exemple donné en fait trop. Il doit être réduit pour: mettre la ligne suivante dans votre .bashrcou .zshrc:alias ls="LC_COLLATE=cs_CZ.ISO8859-2 ls"
user1561489
0

Courir:

$ type ls

Vous constaterez probablement que votre lscommande a un alias.

MikeyB
la source
Sous Linux: ls is /bin/ls. Sur OS X: ls is hashed (/bin/ls). Quoi qu'il en soit, même si j'appelle /bin/lsdirectement, il ne trie toujours pas selon LC_COLLATE.
2
C'est surprenant, j'aurais parié que votre lscommande avait un alias à inclure --group-directories-first. Cela peut encore être fait ailleurs, mais pas un alias.
MikeyB
0

Si vous êtes principalement concerné par l'ordre de tri des fichiers de points, vous pouvez trier par extension : Utilisez la lscommande de GNU Fileutils avec l'option --sort=extension. (Vous pouvez installer GNU Fileutils, par exemple via macports.)

halloleo
la source
0

ls trie selon LC_COLLATE, c'est juste que la plupart des fichiers LC_COLLATE sont configurés pour effectuer un tri sensible à la casse. http://collation-charts.org/fbsd54/

Il y en a deux qui sont définis pour le tri insensible à la casse: cs_CZ.ISO8859-2 et et_EE.ISO8859-15 et_EE.ISO8859.15 ne trie pas "Z" comme les anglophones le souhaiteraient. cs.CZ.ISO8859-15 fait un bon travail avec l'alphabet, je souhaite juste qu'il trie "~" avant les caractères alphabétiques.

Ma solution est: LC_COLLATE = cs_CZ.ISO8859-2 / bin / ls -FG

Je me demande si un fichier LC_COLLATE personnalisé pourrait être créé pour gérer "." comme vous voulez et "~" comme je veux.

Mike
la source