Ich habe ein paar Dateien von log1
bis log164
.
Ich versuche, das Verzeichnis (sortiert) in einem UNIX-Terminal aufzulisten, aber die Sortierfunktionen bieten nur das folgende Format:
home:logs Home$ ls -1 | sort
log1.gz
log10.gz
log100.gz
log101.gz
log102.gz
log103.gz
log104.gz
log105.gz
log106.gz
...etc
Was ich will ist
home:logs Home$ ls -1 | sort
log1.gz
log2.gz
log3.gz
log4.gz
log5.gz
log6.gz
log7.gz
...{more here}
log99.gz
log100.gz
log101.gz
log102.gz
...etc
Irgendwelche Vorschläge, was ich dazu gebrauchen könnte?
log1.gz
durch benannt sindlog164.gz
, wofür brauchen Siels -1
sie dann überhaupt?ls -1
tut: es listet Dateinamen auf. Da Sie die Dateinamen bereits kannten, habe ich nicht verstanden, wofür Sie sie brauchten. Aber da Sie Kevins Antwort akzeptiert haben, weiß ich jetzt: Sie haben sie nicht gebraucht. Welches macht mehr Sinn. :-)Antworten:
bash
's geschweifte Klammern{}
werden sie in der folgenden Reihenfolge auflisten:quelle
Warum nicht die integrierte
ls
Funktion für diesen speziellen Fall verwenden, nämlich-v natural sort of (version) numbers within text
Zum Beispiel
ls -1v log*
quelle
sort
für den Fall, dass man eine Reihe von Zeichenfolgen anstelle eines Verzeichnisses von Dateien hat-v - Force unedited printing of non-graphic characters
.ls | sort -n
Mit GNU ls (dh unter Linux, Cygwin oder anderen Systemen, auf denen GNU ls speziell installiert ist):
In zsh:
In anderen Schalen:
Ersetzen Sie
echo
durch,printf '%s\n'
wenn jeder Dateiname in einer separaten Zeile stehen soll.Wenn Sie auch Dateimetadaten möchten (
ls -l
) und keine GNU ls haben, müssen Siels
für jeden Dateinamen oder jede Gruppe von Dateinamen, die Sie in lexikografischer Reihenfolge anzeigen möchten, einen separaten Aufruf durchführen.Um diese Schwierigkeiten zu vermeiden, verwenden Sie in Ihren Dateinamen so viele führende Nullen, dass die lexikografische Sortierung menschlich ist (
log001.gz
usw.).quelle
Obwohl die Lösung
ls -1v
in diesem speziellen Fall sicherlich die beste ist, finde ich es gut, auch eine zu haben, diesort
wie in der ursprünglichen Frage funktioniert, da dies auch dann funktioniert, wenn Ihre Eingabe nicht von stammtls
. In diesem Fall können Sie verwenden:Die
-n
Option weist sort an, numerisch zu sortieren, und-k 1.4
legt den Sortierschlüssel auf das erste Feld (in diesem Fall den gesamten Dateinamen) vom 4. bis zum letzten Zeichen fest.quelle
ls -1 | sort -n -k1.4
funktioniert das nicht. Es gibt unsortierte zuerst bis zu 4 Zeichen, dann sortierte nach dem 4. Zeichen. Ich habels -1 |sort | sort -n -k1.4
stattdessen verwendet und es hat perfekt funktioniert.sort -k1.1,1.3 -k1.4n
.sort
Implementierungen müssen nicht stabil sein, sodass Ihr Ansatz nicht bei allen Implementierungen funktioniert. Siehe auch die-V
Option von GNU und FreeBSDsort
.Die GNU
sort
(wie sie unter Linux verfügbar ist) verfügt über einen "Versionssortier" -Modus, der Zahlen in Nicht-Zahlen so interpretiert, wie Sie es wünschen:Von
man 1 sort
:(Erstellen von leeren Test Dateien aufzulisten:
touch log1.gz log2.gz log3.gz log99.gz log100.gz log101.gz log102.gz
)Ihr Beispielfall, der die
-V
Option (oder--version-sort
) hinzufügt :quelle
Wenn Sie einen Mac oder BSD verwenden, versuchen Sie Folgendes:
quelle
Meine Solaris-Version unterstützt
ls -v
(grrr) nicht. Und die oben bereitgestellte Sortierlösung 1) erfordert die Kenntnis der Position der Ziffern im Dateinamen und 2) behandelt keine Dinge wie mehrteilige Versionsnummern.Der folgende Ansatz ist Solaris-kompatibel, erfordert keine Vorkenntnisse der Ziffernpositionen und verarbeitet Versionsnummern mit 2, 3 oder 4 Komponenten (wie: a-1.2, foo-5.6.7, bar_baz_9.10.11.12). Es wird auch verwendet
sort -f
, um Groß- und Kleinbuchstaben zusammenzufalten und Verzeichnisse, die mit Dateien vermischt sind, richtig zu behandeln:ls -d | sort -f -t . -k 1,1 -k 2,2n -k 3,3n -k 4,4n
Beachten Sie, dass diese Version die erste Komponente auf eine einzelne Ziffer beschränkt.
Wenn Ihr (e) Zielbetriebssystem (e) dies unterstützt
ls -v
, ist dies eindeutig die überlegene Lösung.quelle
Perl-Lösung:
quelle
quelle
-t .
ist hier überflüssig.Das hat bei mir funktioniert.
Ich habe Dateien 1.jpg 2.jpg ... 18.jpg
$ echo *.jpg | tr -s ' ' '\n' | sort -n
sort
wirdls
wegen nicht druckbarer Farbzeichen mit der Ausgabe verwechselt . Wenn Sie dies versuchen:ls -1 --color=none *.jpg | sort -n
es wird perfekt funktionieren.
sort
kann nicht druckbare Zeichen mit-i
Option ignorieren, aber es funktioniert immer noch nicht und ich weiß nicht warum.Aber Sie können die Farbe immer so streifen und es
sort
wird funktionieren:ls -1 --color=always *.jpg | sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[mGK]//g" | sort -n
Ich hoffe, dass wir eines Tages
sort
eine Option dafür haben werden.quelle