Wie kann ich dafür sorgen, dass "ls" zuerst Punktedateien anzeigt?

46

Irgendwo auf dem Weg habe ich meinen Befehl verkorkst und jetzt bekomme ich diese Bestellung beim Laufen

$ 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

Was habe ich getan, um die Punktedateien zu ignorieren und stattdessen nach dem ersten Buchstaben zu ordnen?

Ausgabe von 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
quelle

Antworten:

47

Versuchen Sie das Hinzufügen

export LC_COLLATE="C"

in Ihren Punktedateien oder Ändern der LC_ALLZuordnung zu:

export LC_ALL="C"

Dies steuert die Art und Weise, wie die Sortierung auf Zeichenebene funktioniert - während die Standardeinstellung darin besteht, Punktdateien inline zu sortieren, werden zuerst Punktdateien in der sortListe erstellt.

Beachten Sie jedoch, dass dies grundsätzlich die Unterstützung Ihres tatsächlichen Gebietsschemas für alle landesspezifischen Dienstprogramme beendet.


Um weiter zu gehen, zitiere das GNU Coreutils-Handbuch (Schwerpunkt Mine):

Wenn Sie ein Nicht-POSIX-Gebietsschema verwenden (z. B. durch Setzen von LC_ALLauf en_US), wird beim Sortieren möglicherweise eine andere als die gewohnte Ausgabe sortiert .

In diesem Fall setzen Sie die LC_ALLUmgebungsvariable auf C. Beachten Sie, dass die Einstellung nur LC_COLLATEzwei Probleme hat. Erstens ist es unwirksam, wenn LC_ALLauch gesetzt ist. Zweitens hat es undefiniertes Verhalten, wenn LC_CTYPE(oder LANGwenn LC_CTYPEnicht festgelegt) auf einen inkompatiblen Wert festgelegt ist. Zum Beispiel erhalten Sie undefiniertes Verhalten, wenn LC_CTYPEist, ja_JP.PCKaber LC_COLLATEist en_US.UTF-8.

slhck
quelle
2
Das Setzen von LC_ALL = "C" hat es geschafft! Danke für die schnelle Antwort
clang1234
7
Wenn Sie LC_ALL = "C" einstellen, werden lsdie Unicode-Dateinamen für Fremdsprachen (z. B. Japanisch) als????????
ohho 23.07.13
Beachten Sie, dass Sie durch das Hinzufügen export LC_ALL="C"Ihrer Punktedateien die Unterstützung für Ihr aktuelles Gebietsschema in allen für das Gebietsschema relevanten Dienstprogrammen verlieren. Während das Drucken Problem , dass @ohho Punkte aus mit behoben werden könnten Faroul Antwort , werden Sie introduce Sortier Probleme: Sortierung nur von Byte - Wert passieren wird, dazu führt , dass ist das Sortieren (a) unerwartet case-sensitive , und (b) immer Orte Zeichen mit Akzent. nachdem alle nicht-akzentuierte diejenigen.
mklement0
35

Um systemweite Änderungen zu vermeiden, die nicht unbedingt erforderlich sind, können Sie nur die Funktionsweise lsdes aktuellen Benutzers ändern, indem Sie den Alias ​​zu den .bashrcfolgenden Elementen hinzufügen :

alias ll='LC_COLLATE=C ls -alF'

Dies sortiert zuerst die Punktedateien und ermöglicht es, "ungewöhnliche" Zeichensätze wie kyrillisch richtig zu handhaben (anzuzeigen und zu sortieren). Der einzige Schuldige, dass die Sortierung zwischen Groß- und Kleinschreibung unterscheidet.

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

Andrey Loskutov
quelle
3
Dies ist die mit Abstand beste Antwort hier
Engineer Dollery
Schön. Viel besser als die systemweite Konfiguration zu ändern (was bei einigen Python-Modulen zu Problemen führen kann).
Gui Ambros
1
Dies war die hilfreichste Antwort. LC_ALLVerwenden Sie außerdem in einer Umgebung, in der bereits etwas festgelegt ist, das mit dem Sortieren / Hochziehen von Punktdateien am Anfang der lsListe nicht kompatibel ist , alias ll='LC_ALL=C ls -alF'stattdessen, da LC_COLLATEdiese nicht überschrieben werden LC_ALL.
Matty
8

Rahmen

LC_ALL="C.UTF-8"

Funktioniert gut für mich - Umlaute und "ls -la" listet zuerst Punktdateien auf.

Faroul
quelle
3
Punktdateien werden zuerst aufgelistet, aber jetzt werden Dateinamen, die mit einem Großbuchstaben beginnen, vor Dateinamen aufgelistet, die mit einem Kleinbuchstaben beginnen.
Chnossos
1
+1 für eine Annäherung an die akzeptierte Antwort, aber um die Einschränkungen zusammenzufassen: Bei der Sortierung wird zwischen Groß- und Kleinschreibung unterschieden , und fremde Zeichen werden - obwohl sie aufgrund von korrekt gedruckt wurden UTF-8- nicht richtig sortiert .
mklement0
3
C.UTF-8ist ein ungültiges Gebietsschema, daher wird das Gebietsschema auf zurückgesetzt C. Sie verlieren weiterhin die UTF-8-Unterstützung. Tatsächlich ist es sogar noch schlimmer, da LC_ALL=Cdie meisten Programme die meisten Multibyte-Zeichen korrekt anzeigen , bei LC_ALL=something_invalideinigen Programmen jedoch nicht (wie `ls).
Martin Tournoij
@MartinTournoij aber wenn Stéphane Chazelas etwas anderes über GNU-Systeme sagt (also vermutlich Debian und Linux im Allgemeinen), was ist richtig?
muru
@muru Ich bin nicht sicher, ich denke, du musst Stéphane fragen? Alles was ich weiß ist, dass localees einen Fehler zu geben scheint mit LC_ALL=C.UTF-8: gist.github.com/Carpetsmoker/ef09b3734b29372939f97107413d7733 - das ist auf Arch Linux.
Martin Tournoij
3

Die Manpage ls (1) führt auf:

-v natürliche Art von (Versions-) Zahlen im Text

Dies scheint die Art und Weise zu ändern, in der die Punkte sortiert werden, und führt zuerst die Gruppierung der Punktedateien durch. Ich habe:

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

in meinem ~ / .bashrc.

Vince Valenti
quelle
1

Eine Idee von der Wand

Haftungsausschluss: Dies wird für die meisten von Ihnen zu viel des Guten sein. Aber ich mache das seit 1995 und ich habe die Fähigkeiten, um meine Welt genau so zu machen, wie ich es will. Also warum nicht?

Ich mag es wirklich, verschiedene Sortiermethoden mit zu verwenden ls, insbesondere -rt(die nach reverse modified time sortieren ). Also habe ich beschlossen, etwas Verrücktes auszuprobieren und awk zu verwenden, um meine Sortierung durchzuführen.

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

Anstatt nun einen Bash-Alias ​​zu definieren, definiere ich eine Bash-Funktion (weil Aliase Argumente nur am Ende anhängen können, aber Funktionen sie überall verwenden können).

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

Um die Ergebnisse zu sehen

Lassen Sie uns einige Beispieldateien erstellen:

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

Mit einfachen 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

Mit meiner Funktion, die mit awk filtert

$ 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

Sie können meine Implementierung hier https://github.com/RichardBronosky/dotfiles/commit/6170c0a9 sehen

Das Wichtigste dabei ist, dass es ein Framework für die Optimierung Ihrer lsAusgabe ist. Mit diesem awk-Filter können Sie alles machen, was Sie wollen. Vielleicht möchten Sie, dass es sich um Verzeichnisse handelt, dann um Punktdateien und dann um alles andere. Sobald Sie wissen, wie Sie mit Ihren xterm-Farben umgehen, ist es nicht allzu schwierig. Es liegt ganz bei Ihnen.

Bruno Bronosky
quelle
-1

Könnte dies in Ihrer .bashrc oder / etc / bashrc Datei versuchen:

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';

Dies setzt voraus, dass Sie eine etwas neuere Version von ls verwenden, die "--group-directorys-first" als Option verwendet. Sie können die LS-Optionen natürlich nach Ihren Wünschen anpassen.

Phil
quelle
Was hat --group-directories-firstdas mit "show dotfiles first" zu tun?
G-Man sagt, dass Monica