Wie kann ich den ls
Befehl 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 ls
Sortierreihenfolge 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=C
wird ls
ähnlich wie OS X sortiert .
LC_COLLATE
ist en_US.UTF-8
in OS X auf eingestellt, ls
sortiert aber immer noch auf die alte POSIX
Art und Weise. Weiß jemand, wie ich dies dazu bringen kann, sich mehr wie Linux zu verhalten?
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
Dieser Befehl sortiert keine Punktdateien, sondern zeigt zusätzliche Verzeichnislisten an
ls -f1
Ich bin dem nahe gekommen:
.
..
.stuff
foo
Foobar
MyStuff
test.txt
ls
und sort
respektieren 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:
Laden Sie MacPorts herunter und installieren Sie es:
Installieren Sie das GNU Coreutils-Paket:
sudo port install coreutils
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 -U
Option bedeutet eigentlich "unsortiert", aber unter OS X hat das den gewünschten Effekt, dass die Groß- und Kleinschreibung nicht beachtet wird.)
Fügen Sie diesen Alias in Ihrem hinzu .bash_profile
, damit der reguläre ls
so 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 -U
Option 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.
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.)
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.
coreutils
und 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.
/usr/local/share/locale
für Ihre benutzerdefinierte Definition zu verwenden, was man setlocale
darauf hinweist, dass es ebenfalls respektiert wird und standardmäßig nur LC_MESSAGES für verschiedene Gebietsschemas zu enthalten scheint.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.
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.
/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"
.bashrc
oder ein .zshrc
:alias ls="LC_COLLATE=cs_CZ.ISO8859-2 ls"
README
und dontreadme
. ls
Wird normalerweise README
zuerst angezeigt. Wenn ich alias ls="LC_COLLATE=cs_CZ.ISO8859-2 ls"
an der Eingabeaufforderung eintrete und es ls
erneut tue, wird es dontreadme
zuerst
aufgelistetVerwenden
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.
Laufen:
$ type ls
Sie werden wahrscheinlich feststellen, dass Ihr ls
Befehl einen Alias hat.
ls is /bin/ls
. Unter OS X: ls is hashed (/bin/ls)
. So oder so, selbst wenn ich /bin/ls
direkt anrufe, wird es immer noch nicht nach LC_COLLATE sortiert.ls
Befehl 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 ls
Befehl aus den GNU Fileutils mit der Option --sort=extension
. (Sie können die GNU Fileutils zB über macports installieren.)
Graham Perrin
SpinUp __ Ein Davis
sort
respektiertls
auch LC_COLLATE, aber die LC_COLLATE-Definition für Gebietsschemas wieen_US.UTF-8
ist nur ein symbolischer Link, der es wie C-Gebietsschema verhält. Siehe Mikes Antwort unten für weitere Details.