Come posso fare prima "ls" per mostrare i dotfile?


46

Da qualche parte lungo la strada ho rovinato il mio comando ls e ora ottengo questo ordine durante l'esecuzione

$ 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

Che cosa ho fatto che ha fatto ignorare i dotfile e invece ordinare per prima lettera?

Uscita di 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

Risposte:


47

Prova ad aggiungere

export LC_COLLATE="C"

nei tuoi dotfile o modificando il LC_ALLcompito in:

export LC_ALL="C"

Questo controlla il modo in cui funziona l'ordinamento a livello di carattere - mentre l'impostazione predefinita sarebbe quella di ordinare i dotfile in linea, questo renderà sortprima l'elenco dei dotfile.

Tuttavia, tieni presente che questo interromperà sostanzialmente il supporto per la tua locale effettiva in tutte le utility compatibili con la locale.


Per andare oltre, citando il manuale GNU Coreutils (sottolineatura mia):

Se si utilizza un'impostazione internazionale non POSIX (ad esempio, impostando LC_ALLsu en_US), l' ordinamento potrebbe produrre un output ordinato diversamente da quello a cui si è abituati.

In tal caso, impostare la LC_ALLvariabile di ambiente su C. Si noti che l'impostazione LC_COLLATEpresenta solo due problemi. Innanzitutto, è inefficace se LC_ALLè impostato anche. In secondo luogo, ha un comportamento indefinito se LC_CTYPE(o LANG, se LC_CTYPEnon è impostato) è impostato su un valore incompatibile. Ad esempio, si ottiene un comportamento indefinito se LC_CTYPEè ja_JP.PCKma LC_COLLATEè en_US.UTF-8.


2
L'impostazione di LC_ALL = "C" ha funzionato! Grazie per la rapida risposta
clang1234

8
Se si imposta LC_ALL = "C", lsi nomi dei file Unicode in lingua straniera (ad es. Giapponese) sono:????????
ohho,

Nota che aggiungendo export LC_ALL="C"ai tuoi dotfile perderai effettivamente il supporto per la tua locale effettiva attraverso tutte le utility che riconoscono la locale. Mentre il problema di stampa che @ohho evidenzia potrebbe essere risolto con la risposta di Faroul , si introdurranno problemi di ordinamento : l'ordinamento avverrà solo in base al valore byte, risultando in un ordinamento che è (a) inaspettatamente sensibile al maiuscolo / minuscolo , e (b) posiziona invariabilmente caratteri accentati. dopo tutti quelli non accentati.
mklement0

35

Per evitare qualsiasi modifica a livello di sistema senza necessità reale, si può cambiare solo il modo in cui lsfunziona per l'utente corrente aggiungendo l'alias a .bashrc:

alias ll='LC_COLLATE=C ls -alF'

Questo ordina prima i file di punti, consente di gestire correttamente (mostrare e ordinare) set di caratteri "non comuni" come il cirillico. L'unico colpevole che l'ordinamento sarà sensibile al maiuscolo / minuscolo.

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


3
Questa è di gran lunga la risposta migliore qui
ingegnere Dollery del

Bellissimo. Molto meglio che cambiare la configurazione dell'intero sistema (che può causare problemi con alcuni moduli Python).
Gui Ambros,

1
Questa è stata la risposta più utile. Inoltre, in un ambiente in cui LC_ALLè già impostato qualcosa di incompatibile con l'ordinamento / sollevamento dei file dot nella parte superiore lsdell'elenco, utilizzare alias ll='LC_ALL=C ls -alF'invece, poiché LC_COLLATEnon sovrascrive LC_ALL.
matty,

8

Ambientazione

LC_ALL="C.UTF-8"

funziona bene per me - umlauts e "ls -la" elenca prima i file-punti.


3
i file di punti sono elencati per primi, ma ora i nomi di file che iniziano con una lettera maiuscola sono elencati prima di quelli che iniziano con una lettera minuscola.
Chnossos,

1
+1 per avvicinarsi alla risposta accettata, ma per riassumere i limiti: l'ordinamento diventerà sensibile al maiuscolo / minuscolo e i caratteri stranieri - mentre ora vengono stampati correttamente a causa di UTF-8- non verranno ordinati correttamente.
mklement0

3
C.UTF-8è una locale non valida, quindi la locale torna a C. Perdi ancora il supporto UTF-8. In effetti, è anche peggio poiché la LC_ALL=Cmaggior parte dei programmi visualizza correttamente la maggior parte dei caratteri multibyte , ma con LC_ALL=something_invalidalcuni programmi no (come `ls).
Martin Tournoij,

@MartinTournoij ma se Stéphane Chazelas dice diversamente sui sistemi GNU (quindi presumibilmente Debian e Linux in generale), che è corretto?
muru,

@muru non sono sicuro, suppongo che dovresti chiedere a Stéphane? Tutto quello che so è che localesembra fuori errore con LC_ALL=C.UTF-8: gist.github.com/Carpetsmoker/ef09b3734b29372939f97107413d7733 - che si trova su Arch Linux.
Martin Tournoij,

4

Gli elenchi di manpage ls (1):

-v ordinamento naturale di numeri (versione) all'interno del testo

Questo sembra cambiare il modo in cui i periodi vengono ordinati e raggruppa prima i dotfile. Io ho:

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

nel mio ~ / .bashrc.


1

Un'idea fuori dal comune

Disclaimer: questo sarà eccessivo per la maggior parte di voi. Ma lo faccio dal 1995 e ho le capacità per rendere il mio mondo esattamente come lo voglio. Quindi, perché no?

Mi piace molto usare diversi metodi di ordinamento ls, in particolare -rt(che è l'ordinamento per ime rmodificato in modo inverso t). Così, ho deciso di provare qualcosa di folle e usare awk per fare il mio ordinamento.

# 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]
}

Ora invece di definire un alias bash, definisco una funzione bash (perché gli alias possono solo aggiungere argomenti alla fine, ma le funzioni possono usarli ovunque)

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

Per vedere i risultati

Creiamo alcuni file di esempio:

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

Usando semplicemente ls

$ 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

Usando la mia funzione che filtra con 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

Puoi vedere la mia implementazione di questo qui https://github.com/RichardBronosky/dotfiles/commit/6170c0a9

La cosa più importante di questo è che è un framework per modificare il tuo lsoutput. Puoi fare tutto quello che vuoi con quel filtro awk. Potresti volere che siano directory, quindi dotfile, quindi tutto il resto. Una volta che sai come gestire i tuoi colori xterm, non è troppo difficile. Dipende totalmente da te.


-1

Potresti provare questo nel tuo file .bashrc o / 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';

Questo presuppone che tu stia eseguendo una versione un po 'più recente di ls che prende "--group-directories-first" come opzione. Puoi ovviamente modificare le opzioni LS a tuo piacimento.


Cosa --group-directories-firstc'entra con "mostra prima i dotfile"?
G-Man dice 'Reinstate Monica' il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.