Créez les fichiers suivants dans un répertoire.
$ touch .a .b a b A B 你好嗎
Ma ls
commande par défaut ignore la présence de points de tête, les confondant avec les autres fichiers.
$ ls -Al
total 0
-rw-r--r-- 1 sparhawk sparhawk 0 Jun 8 17:03 a
-rw-r--r-- 1 sparhawk sparhawk 0 Jun 8 17:03 .a
-rw-r--r-- 1 sparhawk sparhawk 0 Jun 8 17:03 A
-rw-r--r-- 1 sparhawk sparhawk 0 Jun 8 17:03 b
-rw-r--r-- 1 sparhawk sparhawk 0 Jun 8 17:03 .b
-rw-r--r-- 1 sparhawk sparhawk 0 Jun 8 17:03 B
-rw-r--r-- 1 sparhawk sparhawk 0 Jun 8 17:06 你好嗎
Je peux changer LC_COLLATE
pour mettre les dotfiles en premier.
$ LC_COLLATE=C ls -Al
total 0
-rw-r--r-- 1 sparhawk sparhawk 0 Jun 8 17:03 .a
-rw-r--r-- 1 sparhawk sparhawk 0 Jun 8 17:03 .b
-rw-r--r-- 1 sparhawk sparhawk 0 Jun 8 17:03 A
-rw-r--r-- 1 sparhawk sparhawk 0 Jun 8 17:03 B
-rw-r--r-- 1 sparhawk sparhawk 0 Jun 8 17:03 a
-rw-r--r-- 1 sparhawk sparhawk 0 Jun 8 17:03 b
-rw-r--r-- 1 sparhawk sparhawk 0 Jun 8 17:06 你好嗎
Malheureusement, l'ordre de tri est sensible à la casse, c'est-à-dire A
et B
précède a
et b
. Est - il possible d'imprimer dotfiles premier tout en restant insensible à la casse ( A
et a
precede B
et b
)?
Modifier: tentative de modification de LC_COLLATE
Jusqu'à présent, aucune des réponses ne reproduit pleinement la fonctionnalité de ls
facilement. En théorie, je pourrais en encapsuler certains dans une fonction, mais cela devrait inclure un code détaillé sur (par exemple) comment travailler sans argument vs fournir un répertoire en tant qu'argument. Ou comment gérer un -d
indicateur explicite .
Alternativement, je pensais qu'il pourrait y avoir une meilleure LC_COLLATE
utilisation. Cependant, je n'arrive pas à faire fonctionner cela. J'utilise actuellement LC_COLLATE="en_AU.UTF-8"
. J'ai vérifié /usr/share/i18n/locales/en_AU
(bien que je ne sois pas sûr que ce soit le bon fichier, car je ne vois aucune référence à UTF-8
); J'ai trouvé ce qui suit.
LC_COLLATE
copy "iso14651_t1"
END LC_COLLATE
/usr/share/i18n/locales/iso14651_t1
contient copy "iso14651_t1_common"
. Enfin, /usr/share/i18n/locales/iso14651_t1_common
contient
<U002E> IGNORE;IGNORE;IGNORE;<U002E> # 47 .
J'ai supprimé cette ligne, exécuté sudo locale-gen
et redémarré mon ordinateur. Malheureusement, cela n'a rien changé.
$@
.Vous pouvez utiliser à la place l'ordre de tri de la coque (qui ne peut donner l'ordre de classement de la locale;
bash
, AT & Tksh
,yash
,tcsh
etzsh
donner les résultats escomptés,mksh
etdash
. Ne pasfish
semble donner un cas pour insensible , mais donne des résultats différents quand il y a des non-ASCII personnages):Cela donne
ls
une liste explicite des fichiers (et répertoires) à lister et désactivels
le tri (-U
qui est une extension GNU).Il y a quelques mises en garde, selon le shell que vous utilisez.
zsh
, l'nomatch
option par défaut entraînera l'échec de la commande si le répertoire ne contient pas de fichiers cachés et non cachés; vous pouvez désactivernomatch
pour éviter cela, mais mieux serait de le faire à laset -o cshnullglob
place (et la commande à échouer uniquement si aucun des globes ne correspond comme dans les(t)csh
premiers ou les shells Unix).zsh
,pdksh
et son dérivé etfish
,.*
l'expansion de, n'inclut pas.
et..
, donc cela correspondls -Al
. Avec d'autres coquilles.
et..
sont inclus pour qu'il correspondels -al
. Dans ce dernier cas, vous devrez modifier les modèles de globalisation pour exclure.
et..
(ls -dUl -- ..?* .[!.]* *
).fish
,(t)csh
ouzsh
, si l'un des modèles de globbing ne correspond à rien,ls
produira un message d'erreur; vous pouvez éviter cela en définissant l'nullglob
option (dansbash
ouzsh
au moins), ou en redirigeantstderr
vers/dev/null
(ls -dUl -- ..?* .[!.]* * 2>/dev/null
). Si vous utiliseznullglob
, faites attention au comportement potentiellement surprenant qui en résulte (voir Shell mangeant des caractères `? ' ).fish
se comporte commebash
avecnomatch
sauf que lorsqu'il est interactif, un message d'avertissement sera émis pour chaque glob qui n'a aucune correspondance.(Merci à Stéphane Chazelas pour tous les retours!)
la source
mksh
et,dash
par exemple, ne triera pas en respectant la casse.-U
(pour signifier non trié) est une extension GNU. Certaines autresls
implémentations comme FreeBSD ont un-U
mais ce n'est pas pour une liste non triée.ls
, vous avez besoin--
avant.*
car cette implémentation accepte les options après les arguments (sauf si POSIXLY_CORRECT est dans l'environnement)ls
tant qu'argument.[!.]
est correct. Voir pubs.opengroup.org/onlinepubs/9699919799/utilities/… . Certains shells (la plupart?) Permettent^
comme synonyme de!
globes de classe de caractères niés. En tout cas, je préfère.[!.] .??* *
être légèrement plus compréhensible que.[!.]* ..?* *
Vous pouvez simplement utiliser deux
ls
commandes distinctes :Contrairement aux autres réponses jusqu'à présent, cette approche affiche les fichiers de points en évitant d'abord les entrées
.
et..
, puis les entrées restantes dansls
l'ordre alphabétique.Les réponses de @StephenKitt pourraient être améliorées pour obtenir le même résultat:
la source
ls
comme argument. (FWIW J'utilise zsh, mais cela est utile pour les personnes bash, je suppose.)Vous pouvez jouer avec les options de la commande ls . Essaye ça:
Où:
la source
-X
drapeau trie par l'extension après le.
, ce qui est totalement différent. De plus, les fichiers sont classés par ordre alphabétique inversé. De plus, bien que les fichiers dot soient les premiers pour mon exemple, cela ne fonctionnera pas dans tous les cas (par exemplea.b
c.d
.a
.c
). Vous l'avez également utilisé à la-a
place de-A
.