Erstellen Sie die folgenden Dateien in einem Verzeichnis.
$ touch .a .b a b A B 你好嗎
In meiner Standardreihenfolge ls
werden führende Punkte ignoriert und mit den anderen Dateien vermischt.
$ ls -Al
total 0
-rw-r--r-- 1 sparhawk sparhawk 0 Jun 8 17:03 a
-rw-r--r-- 1 sparhawk sparhawk 0 Jun 8 17:03 .a
-rw-r--r-- 1 sparhawk sparhawk 0 Jun 8 17:03 A
-rw-r--r-- 1 sparhawk sparhawk 0 Jun 8 17:03 b
-rw-r--r-- 1 sparhawk sparhawk 0 Jun 8 17:03 .b
-rw-r--r-- 1 sparhawk sparhawk 0 Jun 8 17:03 B
-rw-r--r-- 1 sparhawk sparhawk 0 Jun 8 17:06 你好嗎
Ich kann ändern LC_COLLATE
, um die Punktedateien zuerst zu setzen.
$ LC_COLLATE=C ls -Al
total 0
-rw-r--r-- 1 sparhawk sparhawk 0 Jun 8 17:03 .a
-rw-r--r-- 1 sparhawk sparhawk 0 Jun 8 17:03 .b
-rw-r--r-- 1 sparhawk sparhawk 0 Jun 8 17:03 A
-rw-r--r-- 1 sparhawk sparhawk 0 Jun 8 17:03 B
-rw-r--r-- 1 sparhawk sparhawk 0 Jun 8 17:03 a
-rw-r--r-- 1 sparhawk sparhawk 0 Jun 8 17:03 b
-rw-r--r-- 1 sparhawk sparhawk 0 Jun 8 17:06 你好嗎
Leider macht dies die Sortierreihenfolge zwischen Groß- und Kleinschreibung, dh A
und B
vor a
und b
. Gibt es eine Möglichkeit, zuerst Punktdateien zu drucken, ohne die Groß- und Kleinschreibung zu beachten ( A
und a
vor B
und b
)?
Bearbeiten: Versuch, LC_COLLATE zu ändern
Keine der bisherigen Antworten gibt die Funktionalität von ls
easy vollständig wieder . Es ist denkbar, dass ich einige davon in eine Funktion einbinden könnte, aber dies müsste einen detaillierten Code enthalten, der beschreibt, wie man ohne Argumente arbeitet, anstatt ein Verzeichnis als Argument anzugeben. Oder wie man mit einer expliziten -d
Flagge umgeht.
Alternativ dachte ich, dass es vielleicht einen besseren geben könnte LC_COLLATE
. Ich kann das jedoch nicht schaffen. Ich benutze gerade LC_COLLATE="en_AU.UTF-8"
. Ich habe es überprüft /usr/share/i18n/locales/en_AU
(obwohl ich nicht sicher bin, ob dies die richtige Datei ist, da ich keinen Verweis darauf sehe UTF-8
). Ich habe folgendes gefunden.
LC_COLLATE
copy "iso14651_t1"
END LC_COLLATE
/usr/share/i18n/locales/iso14651_t1
enthält copy "iso14651_t1_common"
. Schließlich /usr/share/i18n/locales/iso14651_t1_common
enthält
<U002E> IGNORE;IGNORE;IGNORE;<U002E> # 47 .
Ich habe diese Zeile gelöscht sudo locale-gen
, ausgeführt und meinen Computer neu gestartet. Daran hat sich leider nichts geändert.
$@
.Sie können die Sortierreihenfolge der Shell verwenden , anstatt (was nicht die Sortierreihenfolge der locale beinhalten kann,
bash
AT & Tksh
,yash
,tcsh
undzsh
die erwarteten Ergebnisse liefern,mksh
unddash
. Nichtfish
scheinen einen Fall unempfindlich zu geben , aber unterschiedliche Ergebnisse liefern , wenn es nicht-ASCII Zeichen):Dies gibt
ls
eine explizite Liste der aufzulistenden Dateien (und Verzeichnisse) und deaktiviertls
die Sortierung (-U
eine GNU-Erweiterung).Je nach verwendeter Shell gibt es einige Einschränkungen.
zsh
der Standardoptionnomatch
schlägt der Befehl fehl, wenn das Verzeichnis nicht sowohl versteckte als auch nicht versteckte Dateien enthält. Sie könnten deaktivierennomatch
, um dies zu vermeiden, aber es wäre besser, diesset -o cshnullglob
stattdessen zu tun (und den Befehl zum Fehlschlagen nur dann auszuführen, wenn keine der Globs wie in(t)csh
oder frühen Unix-Shells übereinstimmt ).zsh
,pdksh
und seiner Ableitung undfish
,.*
schließt die Erweiterung.
und nicht ein..
, daher passt dies zusammenls -Al
. Mit anderen Muscheln.
und..
sind so enthalten, dass es passtls -al
. Im letzteren Fall müssten Sie die Globbing-Muster ändern, um.
und..
(ls -dUl -- ..?* .[!.]* *
) auszuschließen .fish
,(t)csh
oderzsh
wenn eines der Muster nicht mit irgendetwas übereinstimmt,ls
wird eine Fehlermeldung ausgegeben. Sie können dies entweder durch Setzen dernullglob
Option (inbash
oderzsh
zumindest) oder durch Umleitenstderr
zu/dev/null
(ls -dUl -- ..?* .[!.]* * 2>/dev/null
) vermeiden . Achten Sie bei der Verwendungnullglob
auf das möglicherweise überraschende Verhalten (siehe Shell, die Zeichen isst ).fish
verhält sich wiebash
mit dernomatch
Ausnahme, dass im interaktiven Modus eine Warnmeldung für jeden Glob ausgegeben wird, der keine Übereinstimmung aufweist.( Vielen Dank an Stéphane Chazelas für all das Feedback!)
quelle
mksh
unddash
zum Beispiel wird nicht ohne Rücksicht auf Groß- und Kleinschreibung sortiert.-U
(um unsortiert zu bedeuten) eine GNU-Erweiterung ist. Einige anderels
Implementierungen wie FreeBSD haben ein,-U
aber es ist nicht für unsortierte Auflistung.ls
müssen Sie--
vor,.*
da diese Implementierung Optionen nach Argumenten akzeptiert (es sei denn, POSIXLY_CORRECT ist in der Umgebung)ls
als Argument angeben möchte .[!.]
ist korrekt. Siehe pubs.opengroup.org/onlinepubs/9699919799/utilities/… . Einige (die meisten?) Shells erlauben^
als Synonym!
in negierten Zeichenklassen Globs. In jedem Fall bevorzuge ich es.[!.] .??* *
, etwas verständlicher zu sein als.[!.]* ..?* *
Sie können einfach zwei separate
ls
Befehle verwenden:Im Gegensatz zu den bisherigen Antworten werden bei diesem Ansatz die Punktedateien zunächst ohne die Einträge
.
und..
und dann inls
alphabetischer Reihenfolge mit den verbleibenden Einträgen angezeigt .@StephenKitt-Antworten können jedoch verbessert werden, um dasselbe Ergebnis zu erzielen:
quelle
ls
als Argument angeben möchte . (FWIW Ich verwende zsh, aber dies ist nützlich für Bash-Leute, nehme ich an.)Sie können mit den ls- Befehlsoptionen spielen. Versuche dies:
Woher:
quelle
-X
Fahne sortiert nach der Erweiterung nach der.
, was völlig anders ist. Außerdem sind die Dateien in umgekehrter alphabetischer Reihenfolge. Auch wenn die Punktedateien für mein Beispiel die ersten sind, funktioniert dies nicht in allen Fällen (za.b
c.d
.a
.c
. B. ). Außerdem hast du-a
stattdessen verwendet-A
.