J'aime pouvoir nommer des fichiers et des répertoires avec un préfixe de soulignement si c'est quelque chose que je veux garder séparé des autres fichiers et répertoires au même niveau. Sous Windows et Mac, par exemple, le préfixe d'un fichier avec un trait de soulignement le trie en haut, devant les fichiers commençant par un caractère alphanumérique.
Mon googling s'est avéré que cela a à voir avec le LC_COLLATE et mes paramètres régionaux actuels (en_US). C'est bien, même si je ne comprends vraiment pas pourquoi en_US ne trie pas comme prévu.
Sur la base du paramètre de site de démonstration ICU Collate, en_US_POSIX semble certainement avoir l'ordre de tri que je recherche (vous devez modifier les exemples de données et ajouter des traits de soulignement pour les tester). Mais je ne vois pas vraiment comment appliquer cela dans mon shell Linux.
Idéalement, j'aimerais pouvoir configurer quelque chose dans ma configuration bash afin que ls trie toujours les soulignés en premier. Comment pourrais-je procéder?
Réponses:
Si vous ne parvenez pas
ls
à trier comme vous le souhaitez, essayez l'expansion du shell.Vous pouvez utiliser des modèles de nom de fichier pour exécuter
ls
avec une liste de fichiers que le shell a déjà triés, en contournant la méthode quils
utilise.En supposant que vous ayez les fichiers
c'est comme courir
Explication:
_*
est un modèle de shell correspondant à n'importe quel nom de fichier commençant par un trait de soulignement, développé par ordre alphabétique.[!_]*
correspond à tout nom de fichier ne commençant pas par un trait de soulignement, développé par ordre alphabétique.-f
indiquels
de ne pas trier, car le shell l'a déjà fait.Pour plus d'informations: expansion du nom de fichier bash
S'il y a des répertoires dans le répertoire courant, vous voudrez exécuter la commande comme ceci pour éviter que ls ne liste les fichiers dans les répertoires:
la source
_
pour faire apparaître les fichiers en premier est un hack spécifique au système d'exploitation; et la version unix de ce hack consiste à démarrer le nom de fichier avec une lettre majuscule: la convention unix par défaut est d'utiliser uniquement des lettres minuscules dans les noms de fichiers.00README
.-f
dit dels
ne pas faire son propre tri, il affiche donc ses arguments dans l'ordre de leur passage. Le résultat de chaque l'expansion générique de la coquille_*
et[!_]*
est une liste triée lexicographiquement.ls
sont triés (en deux groupes: les premiers_
, puis les autres) lorsqu'ils sont générés par le shell. Courezecho ls -lf _* [!_]*
pour voir ce qui se passe. Le-f
drapeau indique dels
ne faire aucun tri.Si vous ne souhaitez pas mélanger les minuscules et les majuscules, définissez vos paramètres régionaux sur
C
, qui prend les caractères dans leur ordre numérique._
se situe entre les majuscules et les minuscules.Les paramètres régionaux
LC_MESSAGES
(langue des messages d'erreur),LC_CTYPE
(jeux de caractères) etLC_TIME
(format de date et d'heure) sont très utiles.LC_COLLATE
etLC_NUMERIC
sont généralement plus problématiques qu'ils n'en valent, je ne recommande pas de les régler. Un tri lexicographique approprié est plus compliqué queLC_COLLATE
prévu, et il peut provoquer toutes sortes de comportements étranges lorsque vous utilisez des plages de caractères dans les expressions régulières.LC_NUMERIC
est surtout cosmétique, sauf lorsque quelque chose tourne mal car un programme a produit un nombre avec un séparateur décimal autre que.
.la source
VAR=value cmd
ensemblesVAR
àvalue
seulement dans l'environnementcmd
et ne touche pas la valeur (ou l' absence de valeur) dans la coquille où vous l' exécutez. Pour que le trait de soulignement apparaisse avant les majuscules, vous devez définir vos propres paramètres régionaux. C'est possible, mais difficile à utiliser, car au moins sous Linux, la bibliothèque standard ne recherche que les définitions de paramètres régionaux dans/usr/lib/locale
- il n'y a pas de~/.locale
variable d'environnement où vous pouvez mettre votreen_tom
paramètre.ls
commande, suivez la suggestion de Mikel .Malheureusement, Linux utilise glibc pour ses informations locales, pas ICU, il n'y a donc aucun moyen de l'appliquer directement à Linux sans dépenser beaucoup d'efforts soit en modernisant ICU dans glibc, soit en complétant les informations locales dans glibc.
la source
L'ajout du
-f
commutateur (pas de tri) l'a montré de cette façon pour moi.man ls
la source
touch 3 1 _1 _3 2 _2 && ls -fl
sorties2 . 1 3 _2 _3 .. _1