Sortieren von ls ohne Berücksichtigung der Groß-/Kleinschreibung in Mac OSX

Wie kann ich den lsBefehl in Max OS X Lion dazu bringen, Dateien und Verzeichnisse ähnlich wie Ubuntu Linux zu sortieren (Groß-/Kleinschreibung beachten, Verzeichnisse NICHT oben, Punktdateien NICHT oben)? Idealerweise möchte ich dies tun, ohne die Ausgabe an einen anderen Befehl wie sort weiterzuleiten.

Ich möchte zum Beispiel sehen:

foo
Foobar
MyStuff/
.stuff/
test.txt

Anstatt von:

.stuff
Foobar
MyStuff/
foo
test.txt

Unter Linux wird die lsSortierreihenfolge durch das Gebietsschema des Systems gesteuert, insbesondere LC_COLLATE. Wenn LC_COLLATE=en_US.UTF-8, sortiert ls die Elemente so, wie ich es möchte. Wenn LC_COLLATE=Cwird lsähnlich wie OS X sortiert .

LC_COLLATEist en_US.UTF-8in OS X auf eingestellt, lssortiert aber immer noch auf die alte POSIXArt und Weise. Weiß jemand, wie ich dies dazu bringen kann, sich mehr wie Linux zu verhalten?

Wenn es hilft: apple.stackexchange.com/a/22304/8546 stellt fest , dass HFS Plus normalerweise so konfiguriert ist, dass die Groß- und Kleinschreibung nicht beachtet wird, die Groß- und Kleinschreibung jedoch beibehalten wird .
Hinweis für Googler: macOS sortrespektiert lsauch LC_COLLATE, aber die LC_COLLATE-Definition für Gebietsschemas wie en_US.UTF-8ist nur ein symbolischer Link, der es wie C-Gebietsschema verhält. Siehe Mikes Antwort unten für weitere Details.

Antworten (10)

Es ist möglicherweise nicht möglich:

Wenn Sie sich den Quellcode für ls ansehen, verwendet er strcoll, um die Dateinamen zu sortieren, und sollte daher LC_COLLATE respektieren.

Einige Online-Postings deuten darauf hin, dass die Locales in BSD (und Darwin/OS X) im Vergleich zu denen in Linux etwas kaputt sind. Ich habe ein eigenes schnelles Sortierprogramm geschrieben, das sein Gebietsschema explizit festgelegt hat, und es mit den Gebietsschemas en_US.UTF-8 und C auf meinem Computer (Mac OS 10.6.3) und einem Universitätscomputer (Linux, FC11?) getestet. Während das Sortieren auf dem Linux-Rechner wie erwartet funktioniert ("a B c" vs. "B a c"), sortiert der Mac sie immer als "B a c".

Quelle: http://ask.metafilter.com/130292/CaseInsensitive-LS-on-Mac-OS-X

URSPRÜNGLICHE ANTWORT

Dieser Befehl sortiert keine Punktdateien, sondern zeigt zusätzliche Verzeichnislisten an

ls -f1 

Ich bin dem nahe gekommen:

.
..
.stuff
foo
Foobar
MyStuff
test.txt
Interessanterweise scheint das "Deaktivieren der Sortierung" mit der Option -f tatsächlich wie erwartet zu sortieren. Ich gehe davon aus, dass dies die Dateisystem-/HFS+-Sortiereinträge mit einer "natürlicheren" Sortierung sind.
Neuere Anmerkung von Googlern: lsund sortrespektieren LC_COLLATE, aber die Definitionen für LC_COLLATE sind in BSD/macOS anders als in Linux. Siehe die Antwort , die derzeit viel weniger Stimmen hat.

Das hat mich jetzt schon eine Weile genervt, und ich habe es endlich in Ordnung gebracht (heh). Nachdem Sie eine Reihe von Vorschlägen ausprobiert haben, die nicht funktioniert haben, hier ist, was funktioniert hat.

Wenn Sie bereit sind, MacPorts (oder Homebrew oder Fink) zu installieren, macht die GNU-Version von ls genau das, was Sie wollen. Ich benutze selbst MacPorts, also werde ich diesen Ansatz erklären:

  1. Laden Sie MacPorts herunter und installieren Sie es:

    http://www.macports.org

  2. Installieren Sie das GNU Coreutils-Paket:

    sudo port install coreutils

  3. Sie sollten jetzt GNU ls: haben gls. Probieren Sie es in einem Verzeichnis aus, das Elemente enthält, die sowohl mit Groß- als auch mit Kleinbuchstaben beginnen:

    gls -U

    (Die -UOption bedeutet eigentlich "unsortiert", aber unter OS X hat das den gewünschten Effekt, dass die Groß- und Kleinschreibung nicht beachtet wird.)

  4. Fügen Sie diesen Alias ​​in Ihrem hinzu .bash_profile, damit der reguläre lsso funktioniert, wie Sie es möchten (ich mag die Farbausgabe, aber Sie können das weglassen, wenn Sie möchten; Sie brauchen nur das -U):

    alias ls='gls -U --color'

Beachten Sie, dass die -UOption auf anderen Plattformen wahrscheinlich nicht funktioniert. In OS X scheint es immer das Richtige zu tun (vielleicht, weil HFS+ praktisch die Groß-/Kleinschreibung nicht beachtet - technisch gesehen "case-aware"), aber wenn Sie es auf einer Linux-Box versuchen, werden die Ergebnisse höchstwahrscheinlich einfach nicht sein überhaupt sortiert.

3. scheint unter macOS >= 10.13 aufgrund des neuen APFS nicht mehr den gewünschten Nebeneffekt (Option -U) zu haben.
Yep … sieht nicht so aus, als gäbe es eine Möglichkeit, dies mit APFS zu tun.
Bestätigen funktioniert jedoch am 10.12. Danke!

Update vom 01.08.2021:

ls -alFG

Erläuterungen:

-a      Include directory entries whose names begin with a dot (.).
-l      (The lowercase letter ``ell''.)  List in long format.  (See below.)  A total sum for all the file sizes is output on a line before the long
        listing.
-F      Display a slash (`/') immediately after each pathname that is a directory, an asterisk (`*') after each that is executable, an at sign (`@')
        after each symbolic link, an equals sign (`=') after each socket, a percent sign (`%') after each whiteout, and a vertical bar (`|') after
        each that is a FIFO.
-G      Enable colorized output.  This option is equivalent to defining CLICOLOR in the environment.  (See below.)

Alt:

Ich weiß, dass dies beantwortet wurde, aber das funktioniert am besten für mich:

ls -f1 -alFG

Es listet alle Details auf und sortiert sie nach Groß- und Kleinschreibung.

Dies scheint mit macOS 11.4 nicht mehr zu funktionieren (ich erhalte eine wirklich unsortierte Auflistung, die wahrscheinlich die Reihenfolge im Dateisystem widerspiegelt).
@cbrnr Warum ablehnen? Ich habe diese Antwort vor über 7 Jahren geschrieben. Wenn Sie einen Vorschlag haben, schlagen Sie ihn vor.
Ich habe abgelehnt, weil Ihre Antwort unter macOS 11.4 nicht mehr funktioniert. Der Titel erwähnt jedoch ausdrücklich OS X Lion, daher habe ich meine Ablehnung entfernt, da es dort möglicherweise noch funktioniert. Die beste Lösung für 11.4 scheint coreutilsund zu sein gls.

Ergänzend zu Mikes Antwort bin ich etwas weiter gegangen und habe einen Weg gefunden, Ihre eigenen Sortierregeln zu definieren.

Die Locale-Definitionen befinden sich in /usr/share/locale/. Jeder Ordner ist ein Gebietsschema und hat eine Datei (oder einen Link) LC_COLLATE, der definiert, welche Symbole "gleich" sind (zum Beispiel, dass U, u und ü beim Bestellen als gleich angesehen werden sollen). Sie können ein Verzeichnis duplizieren, wodurch eine neue Gebietsschemadefinition erstellt wird:

$ sudo cp -R en_GB.UTF-8/ en_GB.UTF-8-CI/

Jetzt haben Sie ein neues Gebietsschema namens „en_GB.UTF-8-CI“ („CI“ für Groß- und Kleinschreibung) und können von dort aus LC_COLLATE verwenden.

Um nun LC_COLLATE in die neue Locale zu ändern, können Sie die Locale-Quellen von http://www.opensource.apple.com/source/adv_cmds/adv_cmds-119/usr-share-locale.tproj/colldef/ herunterladen und diese bearbeiten das kommt dem am nächsten, was Sie wollen und ausführen

$ colldef < <new collation file>
$ sudo cp LC_COLLATE /usr/share/locale/en_GB.UTF-8-CI/

und jetzt, wenn du rennst

$ LC_COLLATE=en_GB.UTF-8-CI ls

Sie werden nach Ihren Regeln sortieren.

Ja, das ist es, was nötig ist, um die Groß-/Kleinschreibung von 'ls' zu ignorieren.

Ziehen Sie vielleicht in Betracht, /usr/local/share/localefür Ihre benutzerdefinierte Definition zu verwenden, was man setlocaledarauf hinweist, dass es ebenfalls respektiert wird und standardmäßig nur LC_MESSAGES für verschiedene Gebietsschemas zu enthalten scheint.
@mmmmmm könnten Sie Ihre Bearbeitung korrigieren - Sie haben ein Grammatikproblem eingeführt

Als Problemumgehung können Sie eine Funktion und einen Alias ​​verwenden:

function lssorted() { /bin/ls "$@" | sort -f ;}
alias ls='lssorted'

Dies erzeugt eine nach Groß- und Kleinschreibung sortierte Ausgabe für den Standardbefehl ls.

Ich muss anmerken: Dies wird fehlschlagen, wenn zum Beispiel -l verwendet wird. Dann erzeugt ls am Anfang eine weitere Zeile „total X“, die ebenfalls sortiert wird.

ls sortiert nach LC_COLLATE, es ist nur so, dass die meisten LC_COLLATE-Dateien so eingestellt sind, dass sie die Groß-/Kleinschreibung beachten. http://collation-charts.org/fbsd54/

Es gibt zwei, die für die Sortierung ohne Berücksichtigung der Groß-/Kleinschreibung eingestellt sind: cs_CZ.ISO8859-2 und et_EE.ISO8859-15 et_EE.ISO8859.15 sortiert "Z" nicht so, wie es englische Sprecher möchten. cs.CZ.ISO8859-15 macht einen guten Job mit dem Alphabet, ich wünschte nur, es würde "~" vor alphabetischen Zeichen sortieren.

Meine Lösung ist: LC_COLLATE=cs_CZ.ISO8859-2 /bin/ls -FG

Ich frage mich, ob eine benutzerdefinierte LC_COLLATE-Datei erstellt werden könnte, um "." wie du willst und "~" wie ich will.

tatsächlich, wenn Sie in schauen /usr/share/locale, sind viele LC_COLLATE-Dateien (z. B. en_US.UTF-8) ein symbolischer Link zu la_LN.US-ASCII, das Großbuchstaben vor Kleinbuchstaben sortiert. cs_CZ.ISO8859-2 hat eine eigene LC_COLLATE-Datei.

Inspiriert von Mikes Antwort habe ich Folgendes zu /etc/bashrc hinzugefügt, und es funktioniert wunderbar in Mojave. Es listet versteckte Dateien am Ende auf, aber das stört mich nicht.

export LC_COLLATE="cs_CZ.ISO8859-2"; alias ls='ls -AlhF'

Sie können die neue Konfiguration anzeigen, indem Sie den Befehl locale ausführen. Entfernen Sie zum Zurücksetzen einfach die Zeile aus /etc/bashrc und melden Sie sich wieder am Terminal an.

$ locale
LANG="en_US.UTF-8"
LC_COLLATE="cs_CZ.ISO8859-2"
LC_CTYPE="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_ALL=

Beachten Sie, dass weder ls -f1 noch ls -f in Mojave für mich funktioniert haben. Ich endete mit einer wirklich unsortierten Liste. Nur die von mir bereitgestellte Lösung hat für mich in Mojave funktioniert.

UPDATE: Gemäß dem Vorschlag von user1561489 in den Kommentaren hatte ich Erfolg mit der folgenden effizienteren Zeile, die in die /etc/bashrc-Datei eingefügt wurde.

alias ls="LC_COLLATE=cs_CZ.ISO8859-2 ls -AlhF"
Die beste Antwort, aber das gegebene Beispiel macht zu viel. Es sollte auf Folgendes reduziert werden: Fügen Sie die folgende Zeile in Ihr .bashrcoder ein .zshrc:alias ls="LC_COLLATE=cs_CZ.ISO8859-2 ls"
@ user1561489, ich habe deinen Vorschlag ausprobiert, aber er hat bei mir nicht funktioniert.
Ich habe es gerade noch einmal versucht und es funktioniert bei mir in Catalina. Versuchen Sie, ein temporäres Verzeichnis zu erstellen und zwei Dateien darin abzulegen: READMEund dontreadme. lsWird normalerweise READMEzuerst angezeigt. Wenn ich alias ls="LC_COLLATE=cs_CZ.ISO8859-2 ls"an der Eingabeaufforderung eintrete und es lserneut tue, wird es dontreadmezuerst aufgelistet
Sie haben Recht. Arbeitete in Mojave. Ich habe Folgendes in /etc/bashrc eingefügt: alias ls="LC_COLLATE=cs_CZ.ISO8859-2 ls -AlhF". Ihren Vorschlag als Update zu meinem Beitrag @user1561489 hinzugefügt.
Vielleicht möchten Sie den sort-Befehl auf die gleiche Weise aliasieren, je nachdem, was Ihre Ziele sind

Verwenden

ls -f

funktioniert bei mir.

-f schaltet offiziell jede Sortierung aus, aber es sieht so aus, als würde dann die ursprüngliche HFS-Sortierung durchscheinen, die genau eine Sortierung ohne Berücksichtigung der Groß- und Kleinschreibung ist.

Ich denke, es hängt tatsächlich davon ab, ob Sie Ihre HD-formatierte Groß-/Kleinschreibung beachten oder nicht, aber da das HFS-Format die Groß-/Kleinschreibung nicht berücksichtigt, ist die Standardeinstellung für Mac OS X-Systemfestplatten, dies sollte für die Mehrheit der Benutzer funktionieren.

Das ist definitiv die richtige Antwort. Das einzige Problem dabei ist, dass es implizit auch -a einschaltet und es keine Möglichkeit gibt, dies auszuschalten, wodurch Ihnen Dateien/Ordner angezeigt werden, die mit einem Punkt beginnen, einschließlich . und .. .
Das andere Problem (jetzt) ​​ist, dass dies unter macOS >= 10.13 aufgrund des neuen APFS nicht mehr zu funktionieren scheint.

Laufen:

$ type ls

Sie werden wahrscheinlich feststellen, dass Ihr lsBefehl einen Alias ​​hat.

Unter Linux: ls is /bin/ls. Unter OS X: ls is hashed (/bin/ls). So oder so, selbst wenn ich /bin/lsdirekt anrufe, wird es immer noch nicht nach LC_COLLATE sortiert.
Das ist überraschend, ich hätte gewettet, dass Ihr lsBefehl Alias ​​war, um einzuschließen --group-directories-first. Es kann immer noch woanders gemacht werden, nur kein Alias.

Wenn es Ihnen hauptsächlich um die Sortierreihenfolge der Punktdateien geht, können Sie nach Erweiterung sortieren : Verwenden Sie den lsBefehl aus den GNU Fileutils mit der Option --sort=extension. (Sie können die GNU Fileutils zB über macports installieren.)