Comment puis-je faire “ls” montrer les fichiers dot en premier?

46

Quelque part sur le chemin, j'ai foiré ma commande ls et maintenant je reçois cette commande en cours d'exécution

$ ls -AhHl --color=auto
-rwxr-xr-x 1 clang clang  640 Mar  1 02:46 apple-touch-icon-precomposed.png
-rwxr-xr-x 1 clang clang  784 Jul 12 02:54 crossdomain.xml
-rwxr-xr-x 1 clang clang 1.2K Mar  1 02:46 favicon.ico
drwxr-xr-x 8 clang clang 4.0K Jul 12 23:50 .git
-rw-r--r-- 1 clang clang   17 Feb 29 19:48 .gitignore
-rwxr-xr-x 1 clang clang 1.4K Jul 12 02:54 humans.txt

Qu’ai-je fait pour que j’ignore les fichiers de points et commande plutôt par première lettre?

Sortie de locale:

$ locale
LANG=
LANGUAGE=
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=en_US.UTF-8
clang1234
la source

Réponses:

47

Essayez d'ajouter

export LC_COLLATE="C"

dans vos fichiers de points, ou changer l' LC_ALLaffectation pour:

export LC_ALL="C"

Ceci contrôle le fonctionnement du tri au niveau des caractères - alors que la valeur par défaut serait de trier les fichiers de points en ligne, cela sortcréera d’abord la liste de fichiers de points.

Toutefois, notez que cela arrêtera essentiellement la prise en charge de vos paramètres régionaux dans tous les utilitaires tenant compte de ces paramètres.


Pour aller plus loin, citons le manuel de GNU Coreutils (notamment de moi):

Si vous utilisez des paramètres régionaux non-POSIX (par exemple, en définissant LC_ALLsur en_US), alors trier peut produire une sortie triée différemment de celle à laquelle vous êtes habitué.

Dans ce cas, définissez la LC_ALLvariable d'environnement sur C. Notez que le réglage LC_COLLATEn'a que deux problèmes. Tout d'abord, il est inefficace si LC_ALLest également défini. Deuxièmement, il a un comportement indéfini si LC_CTYPE(ou LANG, si LC_CTYPEnon défini) est défini sur une valeur incompatible. Par exemple, vous obtenez un comportement indéfini si LC_CTYPEest ja_JP.PCKmais LC_COLLATEest en_US.UTF-8.

slhck
la source
2
Paramétrer LC_ALL = "C" a fait le tour! Merci pour la réponse rapide
clang1234
8
ls????????
Si vous définissez
Notez qu'en ajoutant export LC_ALL="C"à vos fichiers de points, vous perdrez effectivement la prise en charge de vos paramètres régionaux actuels pour tous les utilitaires tenant compte de ces paramètres. Bien que le problème d' impression mentionné par @ohho puisse être résolu avec la réponse de Faroul , vous introduirez des problèmes de tri : le tri se fera uniquement par valeur d'octet, entraînant un tri qui est (a) sensible de manière inattendue à la casse et (b) invariablement caractères accentués. après tous les non-accentués.
mklement0
35

Pour éviter toute modification du système sans nécessité réelle, vous pouvez modifier uniquement le lsfonctionnement de l'utilisateur actuel en ajoutant l'alias au .bashrc:

alias ll='LC_COLLATE=C ls -alF'

Cela trie d’abord les fichiers à points, permet de gérer correctement (afficher et trier) les jeux de caractères "inhabituels" comme cyrillic. Le seul coupable que le tri sera sensible à la casse.

Source: http://ubuntuforums.org/showthread.php?t=816753

Andrey Loskutov
la source
3
C'est de loin la meilleure réponse
Ingénieur Dollery
Beau. Bien mieux que de changer la configuration à l’échelle du système (ce qui peut vous causer des problèmes avec certains modules python).
Gui Ambros
1
C'était la réponse la plus utile. De plus, dans un environnement où LC_ALLest déjà défini quelque chose d'incompatible avec le tri / levage des fichiers de points en haut de la lsliste, utilisez alias ll='LC_ALL=C ls -alF'plutôt, car LC_COLLATEne remplace pas LC_ALL.
Matty
8

Réglage

LC_ALL="C.UTF-8"

fonctionne très bien pour moi - umlauts et "ls -la" listent d’abord les fichiers de points.

Faroul
la source
3
Les fichiers par points sont listés en premier, mais les noms de fichiers commençant par une lettre majuscule sont listés avant ceux qui commencent par une minuscule.
Chnossos
1
+1 pour vous rapprocher de la réponse acceptée, mais pour résumer les limitations: le tri deviendra sensible à la casse , et les caractères étrangers, bien qu'imprimés correctement à cause de UTF-8, ne seront pas triés correctement.
mklement0
3
C.UTF-8est une locale invalide, donc la locale est rétablie C. Vous perdez toujours le support UTF-8. En fait, c'est encore pire puisque la LC_ALL=Cplupart des programmes affichent correctement la plupart des caractères multi-octets , mais LC_ALL=something_invalidcertains programmes n'en affichent pas (comme `ls).
Martin Tournoij
@MartinTournoij mais si Stéphane Chazelas dit autre chose des systèmes GNU (donc vraisemblablement de Debian et de Linux en général), lequel est correct?
Muru
@muru je ne suis pas sûr, je suppose que vous devrez demander à Stéphane? Tout ce que je sais, c'est qu'il localesemble y avoir une erreur avec LC_ALL=C.UTF-8: gist.github.com/Carpetsmoker/ef09b3734b29372939f97107413d7733 - c'est sur Arch Linux.
Martin Tournoij
4

La liste de pages de manuel ls (1):

-v sorte naturelle de nombres (version) dans le texte

Cela semble changer la façon dont les périodes sont triées et groupe les fichiers dot en premier. J'ai:

alias ls='ls -vAF'
alias ll='ls -l'

dans mon ~ / .bashrc.

Vince Valenti
la source
1

Une idée décalée

Avertissement: Cela va être exagéré pour la plupart d'entre vous. Mais je le fais depuis 1995 et j'ai les compétences nécessaires pour que mon monde soit exactement comme je le veux. Alors pourquoi pas moi?

J'aime beaucoup utiliser différentes méthodes de tri avec ls, en particulier -rt(c'est-à-dire trier par rmodification inverse t). J'ai donc décidé d'essayer quelque chose de fou et d'utiliser awk pour faire mon tri.

# save as ~/.ls.awk
# inpsired by http://superuser.com/questions/448291/how-can-i-make-ls-show-dotfiles-first

{
    if($1 == "total"){
        print $0
        next
    }
    # may need to adjust $9 to match your name column
    if(match($9, /^(\033\[[0-9]*m)*\./)) # optionally look past xterm highlighting like: ^[[34m
        df[++dd] = $0
    else
        nf[++nn] = $0
}
END{
    while (++d in df)
        print df[d]
    while (++n in nf)
        print nf[n]
}

Maintenant, au lieu de définir un alias bash, je définis une fonction bash (car les alias peuvent uniquement ajouter des arguments à la fin, mais les fonctions peuvent les utiliser n'importe où)

ll(){ CLICOLOR_FORCE=1 ls -lhA $* | awk -f ~/.ls.awk; }

Pour voir les résultats

Créons quelques exemples de fichiers:

for n in 4 .4 3 .3 2 .2 1 .1; do touch $n; sleep 1; done

Utilisation de ls simples

$ ls -lA
total 8
-rw-r--r--  1 bbronosky  staff    0 Dec  1 00:25 .1
-rw-r--r--  1 bbronosky  staff    0 Dec  1 00:25 .2
-rw-r--r--  1 bbronosky  staff    0 Dec  1 00:25 .3
-rw-r--r--  1 bbronosky  staff    0 Dec  1 00:25 .4
-rwxr-xr-x  1 bbronosky  staff  285 Nov 29 13:14 .ls.awk
-rwxr-xr-x  1 bbronosky  staff    0 Dec  1 00:25 1
-rwxr-xr-x  1 bbronosky  staff    0 Dec  1 00:25 2
-rwxr-xr-x  1 bbronosky  staff    0 Dec  1 00:25 3
-rwxr-xr-x  1 bbronosky  staff    0 Dec  1 00:25 4
$ ls -lArt

total 8
-rwxr-xr-x  1 bbronosky  staff  285 Nov 29 13:14 .ls.awk
-rwxr-xr-x  1 bbronosky  staff    0 Dec  1 00:25 4
-rw-r--r--  1 bbronosky  staff    0 Dec  1 00:25 .4
-rwxr-xr-x  1 bbronosky  staff    0 Dec  1 00:25 3
-rw-r--r--  1 bbronosky  staff    0 Dec  1 00:25 .3
-rwxr-xr-x  1 bbronosky  staff    0 Dec  1 00:25 2
-rw-r--r--  1 bbronosky  staff    0 Dec  1 00:25 .2
-rwxr-xr-x  1 bbronosky  staff    0 Dec  1 00:25 1
-rw-r--r--  1 bbronosky  staff    0 Dec  1 00:25 .1

Utiliser ma fonction qui filtre avec awk

$ ll
total 8
-rw-r--r--  1 bbronosky  staff     0B Dec  1 00:25 .1
-rw-r--r--  1 bbronosky  staff     0B Dec  1 00:25 .2
-rw-r--r--  1 bbronosky  staff     0B Dec  1 00:25 .3
-rw-r--r--  1 bbronosky  staff     0B Dec  1 00:25 .4
-rwxr-xr-x  1 bbronosky  staff   285B Nov 29 13:14 .ls.awk
-rwxr-xr-x  1 bbronosky  staff     0B Dec  1 00:25 1
-rwxr-xr-x  1 bbronosky  staff     0B Dec  1 00:25 2
-rwxr-xr-x  1 bbronosky  staff     0B Dec  1 00:25 3
-rwxr-xr-x  1 bbronosky  staff     0B Dec  1 00:25 4

$ ll -rt
total 8
-rwxr-xr-x  1 bbronosky  staff   285B Nov 29 13:14 .ls.awk
-rw-r--r--  1 bbronosky  staff     0B Dec  1 00:25 .4
-rw-r--r--  1 bbronosky  staff     0B Dec  1 00:25 .3
-rw-r--r--  1 bbronosky  staff     0B Dec  1 00:25 .2
-rw-r--r--  1 bbronosky  staff     0B Dec  1 00:25 .1
-rwxr-xr-x  1 bbronosky  staff     0B Dec  1 00:25 4
-rwxr-xr-x  1 bbronosky  staff     0B Dec  1 00:25 3
-rwxr-xr-x  1 bbronosky  staff     0B Dec  1 00:25 2
-rwxr-xr-x  1 bbronosky  staff     0B Dec  1 00:25 1

Vous pouvez voir ma mise en œuvre ici https://github.com/RichardBronosky/dotfiles/commit/6170c0a9

Le plus important, c’est qu’il s’agit d’un cadre permettant de peaufiner votre lsproduction. Vous pouvez faire ce que vous voulez avec ce filtre awk. Vous voudrez peut-être que ce soit des répertoires, puis des fichiers .ots, puis tout le reste. Une fois que vous savez manipuler vos couleurs xterm, ce n’est pas trop difficile. C'est totalement à vous.

Bruno Bronosky
la source
-1

Essayez ceci dans votre fichier .bashrc ou / etc / bashrc:

LS_OPTIONS='--color=tty -A -F -X -B -h -v -b -T 0 --group-directories-first';
export LS_OPTIONS;
alias ls='/bin/ls $LS_OPTIONS';

Cela suppose que vous utilisez une version un peu plus récente de ls qui prend "--group-Directories-first" en option. Vous pouvez évidemment ajuster les options LS à votre convenance.

Phil
la source
Qu'est-ce qui --group-directories-firsta à voir avec "montrer les fichiers dot en premier"?
G-Man dit 'Réintégrez Monica'