Groß- und Kleinschreibung wird unter Mac OSX nicht berücksichtigt

30

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

Zum Beispiel möchte ich sehen:

foo
Foobar
MyStuff/
.stuff/
test.txt

anstatt:

.stuff
Foobar
MyStuff/
foo
test.txt

Unter Linux wird die lsSortierreihenfolge speziell vom Gebietsschema des Systems gesteuert LC_COLLATE. Wann LC_COLLATE=en_US.UTF-8sortiere ich nach Belieben? Wenn LC_COLLATE=C, lswird auf OS X. ähnlich sortieren

LC_COLLATEist auf en_US.UTF-8OS X eingestellt, lssortiert aber immer noch die alte POSIXArt und Weise. Weiß jemand, wie ich dieses Verhalten Linux ähnlicher machen kann?

Emil
quelle
Wenn es hilft: apple.stackexchange.com/a/22304/8546 stellt fest, dass HFS Plus normalerweise so konfiguriert ist, dass zwischen Groß- und Kleinschreibung nicht unterschieden wird, die Groß- und Kleinschreibung jedoch beibehalten wird .
Graham Perrin

Antworten:

16

Möglicherweise ist Folgendes nicht möglich:

Wenn Sie sich den Quellcode von ls ansehen, werden die Dateinamen mit strcoll sortiert. Daher sollte LC_COLLATE beachtet werden.

Einige Online-Veröffentlichungen deuten darauf hin, dass die Gebietsschemata in BSD (und Darwin / OS X) im Vergleich zu denen in Linux etwas fehlerhaft sind. Ich habe ein eigenes schnelles Sortierprogramm geschrieben, das die Ländereinstellung explizit festlegt, und es mit den Ländereinstellungen 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-Computer 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, zeigt jedoch zusätzliche Verzeichnislisten an

ls -f1 

Ich bin dem nahe gekommen:

.
..
.stuff
foo
Foobar
MyStuff
test.txt
Sairam
quelle
1
Interessant ist, dass das "Deaktivieren der Sortierung" mit der Option -f tatsächlich wie erwartet zu sortieren scheint. Ich gehe davon aus, dass dies das Dateisystem / HFS + ist, das Einträge mit einer "natürlicheren" Sortierung sortiert.
Gerry
6

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

ls -f1 -alF -G

Es listet alle Details auf und sortiert sie, indem Groß- und Kleinschreibung ignoriert wird.

Jared Burrows
quelle
4

Das nervt mich jetzt schon eine Weile und ich habe es endlich geklärt (heh). Nachdem Sie eine Reihe von Vorschlägen ausprobiert haben, die nicht funktionierten, haben Sie Folgendes getan.

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

  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. Versuchen Sie es in einem Verzeichnis, das Elemente enthält, die mit Groß- und Kleinbuchstaben beginnen:

    gls -U

    (Die -UOption bedeutet eigentlich "unsortiert", aber unter OS X bewirkt dies, dass die Groß- und Kleinschreibung nicht berücksichtigt wird.)

  4. Fügen Sie diesen Alias in Ihrem .bash_profileso der regulären lsfunktioniert so , wie Sie es haben wollen (ich wie die Farbausgabe, aber Sie können das weglassen , wenn Sie möchten, brauchen Sie nur die -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 unabhängig von Groß- und Kleinschreibung ist - "case-aware", technisch gesehen), aber wenn Sie es auf einer Linux-Box versuchen, werden die Ergebnisse höchstwahrscheinlich einfach nicht sein überhaupt sortiert.

Jason Sims
quelle
1
3. scheint unter macOS> = 10.13 aufgrund des neuen APFS nicht mehr die gewünschte Nebenwirkung (-U Option) zu haben.
Marius Hofert
1
Ja… sieht nicht so aus, als gäbe es eine Möglichkeit, dies mit APFS zu tun.
Jason Sims
Bestätigen funktioniert aber am 10.12. Vielen Dank!
Oberst Panic
4

In Ergänzung zu dem, was Mike oben geschrieben hat, habe ich noch einen Schritt weiter gegangen und einen Weg gefunden, um Ihre eigenen Kollatierungsregeln zu definieren.

Die Gebietsschemadefinitionen befinden sich in / usr / share / locale /. Jeder Ordner ist ein Gebietsschema und hat eine Datei (oder einen Link) LC_COLLATE, die definiert, welche Symbole "gleich" sind (zum Beispiel, dass U, u und ü bei der Bestellung gleich sind). Sie können ein Verzeichnis duplizieren. Dadurch wird eine neue Gebietsschemadefinition erstellt:

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

Jetzt haben Sie ein neues Gebietsschema mit dem Namen 'en_GB.UTF-8-CI' ('CI' für case-insensitive) und können dort LC_COLLATE verwenden.

Um LC_COLLATE in der neuen Ländereinstellung zu ändern, können Sie die Ländereinstellungsquellen von http://www.opensource.apple.com/source/adv_cmds/adv_cmds-119/usr-share-locale.tproj/colldef/ herunterladen und bearbeiten Das kommt dem, was Sie wollen und wollen, am nächsten

$ 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 müssen nach Ihren Regeln sortieren .

Ja, das ist es, was es braucht, um die Groß- und Kleinschreibung von 'ls' zu ignorieren.

Dmitry
quelle
2

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

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

Dies erzeugt eine fallunabhängig sortierte Ausgabe für den Standard-Befehl ls.

Arne
quelle
1
Ich muss beachten: dies wird fehlschlagen, wenn zum Beispiel -l verwendet wird. Dann erzeugt ls am Anfang eine weitere Zeile "total X", die ebenfalls sortiert wird.
Arne
2

Verwenden

ls -f

funktioniert bei mir.

-f Schaltet offiziell jede Sortierung aus, aber es sieht so aus, als ob die ursprüngliche HFS-Sortierung durchscheint, bei der die Groß- und Kleinschreibung nicht beachtet wird.

Es hängt davon ab, ob bei Ihrem HD-Format zwischen Groß- und Kleinschreibung unterschieden wird oder nicht. Da jedoch bei Mac OS X-Systemfestplatten das HFS-Format zwischen Groß- und Kleinschreibung als Standardformat festgelegt ist, sollte dies für die meisten Benutzer funktionieren.

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

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

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

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 beim 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 gearbeitet haben. Am Ende hatte ich eine wirklich unsortierte Liste. Nur die Lösung, die ich bereitgestellt habe, hat in Mojave funktioniert.

Jer
quelle
Die beste Antwort, aber das gegebene Beispiel macht zu viel. Es sollte .bashrc.zshrcalias ls="LC_COLLATE=cs_CZ.ISO8859-2 ls"
gekürzt werden auf
0

Lauf:

$ type ls

Sie werden wahrscheinlich feststellen, dass Ihr lsBefehl ein Alias ​​ist.

MikeyB
quelle
Unter Linux: ls is /bin/ls. Unter OS X: ls is hashed (/bin/ls). So oder so, auch wenn ich /bin/lsdirekt anrufe, wird immer noch nicht nach LC_COLLATE sortiert.
2
Das ist überraschend, ich hätte gewettet, dass Ihr lsBefehl so ausgerichtet war, dass er einbezogen wurde --group-directories-first. Es kann immer noch irgendwo anders gemacht werden, nur nicht als Alias.
MikeyB
0

Wenn Sie hauptsächlich mit der Sortierreihenfolge der Punktedateien befasst sind , können Sie nach Erweiterung sortieren : Verwenden Sie den lsBefehl aus dem GNU Fileutils mit der Option --sort=extension. (Sie können die GNU Fileutils zB über Macports installieren.)

halloleo
quelle
0

Es wird nach LC_COLLATE sortiert. Die meisten LC_COLLATE-Dateien sind nur so eingestellt, dass die Groß- und Kleinschreibung beachtet wird. http://collation-charts.org/fbsd54/

Es gibt zwei Sortierungen, bei denen zwischen Groß- und Kleinschreibung nicht unterschieden wird: cs_CZ.ISO8859-2 und et_EE.ISO8859-15 et_EE.ISO8859.15 sortiert "Z" nicht so, wie es die englischsprachigen Benutzer wünschen. 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 lautet: LC_COLLATE = cs_CZ.ISO8859-2 / bin / ls -FG

Ich frage mich, ob eine benutzerdefinierte LC_COLLATE-Datei "." wie du willst und "~" wie ich will.

Mike
quelle