Ich mag es, Dateien und Verzeichnisse mit einem Unterstreichungspräfix zu benennen, wenn es etwas ist, das ich von anderen Dateien und Verzeichnissen auf derselben Ebene trennen möchte. Wenn Sie beispielsweise unter Windows und Mac eine Datei mit einem Unterstrich voranstellen, wird diese nach oben sortiert, und zwar vor Dateien, die mit einem alphanumerischen Zeichen beginnen.
Es hat sich herausgestellt, dass mein Googeln mit LC_COLLATE und meinem aktuellen Gebietsschema (de_DE) zu tun hat. Das ist in Ordnung, obwohl ich wirklich nicht verstehe, warum en_US nicht wie erwartet sortiert.
Basierend auf der ICU Collate-Demonstrationssite, die das Gebietsschema auf "en_US_POSIX" setzt, scheint die von mir gesuchte Sortierreihenfolge zu stimmen (Sie müssen die Beispieldaten bearbeiten und einige Unterstriche hinzufügen, um sie zu testen). Aber ich sehe nicht wirklich, wie ich das in meiner Linux-Shell anwenden soll.
Im Idealfall möchte ich in meiner Bash-Konfiguration etwas einrichten können, damit ls immer zuerst die Unterstriche sortiert. Wie würde ich das machen?
Antworten:
Wenn Sie nicht
ls
so sortieren können, wie Sie möchten, versuchen Sie es mit einer Shell-Erweiterung.Mithilfe von Dateinamenmustern können Sie
ls
eine Liste von Dateien ausführen , die von der Shell unter Umgehung der verwendeten Methode bereits sortiert wurdenls
.Vorausgesetzt, Sie haben die Dateien
das ist wie Laufen
Erläuterung:
_*
ist ein Shell-Muster, das jedem Dateinamen entspricht, der mit einem in alphabetischer Reihenfolge erweiterten Unterstrich beginnt.[!_]*
Stimmt mit jedem Dateinamen überein, der nicht mit einem in alphabetischer Reihenfolge erweiterten Unterstrich beginnt.-f
sagtls
zu nicht sortieren, da die Shell bereits getan hat.Weitere Informationen: Bash-Dateinamenerweiterung
Wenn sich im aktuellen Verzeichnis Verzeichnisse befinden, möchten Sie den Befehl folgendermaßen ausführen, um zu vermeiden, dass Dateien in den Verzeichnissen aufgelistet werden:
quelle
_
erstmalige Anzeigen von Dateien ist ein betriebssystemspezifischer Hack. und die Unix-Version dieses Hacks soll den Dateinamen mit einem Großbuchstaben beginnen: Die Standard-Unix-Konvention besteht darin, in Dateinamen nur Kleinbuchstaben zu verwenden.00README
.-f
weistls
an, keine eigene Sortierung vorzunehmen , und zeigt die Argumente in der Reihenfolge an, in der sie übergeben werden. Das Ergebnis jeder der Schale Wildcard Expansion_*
und[!_]*
eine lexikographisch sortiert Liste.ls
werden sortiert (in zwei Gruppen: diejenigen, die mit beginnen_
, dann die anderen), wenn sie von der Shell generiert werden. Lauf, umecho ls -lf _* [!_]*
zu sehen, was passiert. Die-f
Flagge sagtls
, dass keine Sortierung durchgeführt werden soll.Wenn Sie Kleinbuchstaben und Großbuchstaben nicht mischen möchten, setzen Sie Ihr Gebietsschema auf
C
, wobei die Zeichen in ihrer numerischen Reihenfolge angezeigt werden._
fällt zwischen Groß- und Kleinschreibung.Die Gebietsschemaeinstellungen
LC_MESSAGES
(Sprache der Fehlermeldungen),LC_CTYPE
(Zeichensätze) undLC_TIME
(Datums- und Uhrzeitformat) sind sehr nützlich.LC_COLLATE
undLC_NUMERIC
sind in der Regel mehr Mühe als sie wert sind, empfehle ich nicht, sie einzustellen. Eine korrekte lexikografische Sortierung ist komplizierter als vorgesehenLC_COLLATE
und kann bei der Verwendung von Zeichenbereichen in regulären Ausdrücken zu verrückten Verhaltensweisen führen.LC_NUMERIC
ist hauptsächlich kosmetisch, außer wenn etwas furchtbar schief geht, weil ein Programm eine Zahl mit einem anderen Dezimaltrennzeichen als erzeugt hat.
.quelle
VAR=value cmd
SätzeVAR
zuvalue
nur in der Umgebungcmd
und berührt nicht den Wert (oder das Fehlen des Wertes) in der Schale , wo Sie es laufen. Damit der Unterstrich vor Großbuchstaben angezeigt wird, müssen Sie Ihre eigenen Ländereinstellungen definieren. Dies ist möglich, aber umständlich zu verwenden, da die Standardbibliothek zumindest unter Linux nur nach Gebietsschemadefinitionen sucht/usr/lib/locale
- es gibt keine~/.locale
oder Umgebungsvariable, in die Sie Ihreen_tom
Einstellung einfügen könnten .ls
Befehl geht, folgen Sie dem Vorschlag von Mikel .Leider verwendet Linux glibc für seine Gebietsschemainformationen, nicht für die ICU. Daher gibt es keine Möglichkeit, diese direkt auf Linux anzuwenden, ohne viel Aufwand zu betreiben, entweder die ICU in glibc nachzurüsten oder die Gebietsschemainformationen in glibc zu ergänzen.
quelle
Das Hinzufügen des
-f
Schalters (keine Sortierung) hat es mir gezeigt.man ls
quelle
touch 3 1 _1 _3 2 _2 && ls -fl
Ausgänge2 . 1 3 _2 _3 .. _1