Wie ls nach Dateierweiterung sortieren und dann benennen?

44

Standardmäßig sortiert der Befehl ls nur nach dem Dateinamen, aber ich möchte, dass Verzeichnisse vor anderen Dateitypen angezeigt werden. Ich möchte vielleicht sogar, dass Dateien nach Erweiterung sortiert werden, so wie Windows Explorer nach der Typenspalte sortiert. Gibt es eine Möglichkeit, etwas Ähnliches mit ls zu tun?

Allyourcode
quelle

Antworten:

42

Ich denke, die vollständige Antwort ist eher eine Kombination der oben genannten.

-X (later --sort=extension)wird seit mindestens FC3 unter Linux unterstützt und wird nach Erweiterung sortiert. --group-directories-firstwurde vor kurzem hinzugefügt (vielleicht um FC8?). Die Kombination beider scheint jedoch nicht zu funktionieren (zumindest bei FC8).

Das Hauptproblem scheint die Verwendung einzelner primärer Sortierschlüssel zu sein. In dieser Mailinglistendiskussion finden Sie einige Einblicke.

JakeGould
quelle
5
Ich weiß, dass dieser Beitrag ziemlich alt ist, aber für andere, die hierher kommen, z. B. von Google (wie ich): Die Kombination von --sort=extensionund --group-directories-first(oder nur --group-directories) funktioniert für mich unter Ubuntu 12.10 einwandfrei. Lohnt sich auch für Ihre Maschine! =)
Tomas Aschan
Ja, kein Problem beim Kombinieren -X / --sort=extensionmit --group-directories-firstund allem anderen, was ich in modernen Linux-Distributionen ausprobiert habe. Das OP bezieht sich auf Fedora Core 8 (veröffentlicht 2007), sodass die Wahrscheinlichkeit besteht, dass solche Probleme in ferner Vergangenheit liegen.
8.
23

Unter Linux

$ ls --group-directories-first

( man lsIst dein Freund!)

JakeGould
quelle
1
Trotz des RTFM-Kommentars hochgestuft.
Sridhar Sarnobat
gls --group-directories-firstauf Mac, wenn Sie GNU Core utilsüber Homebrew installieren
To Kra
14

-X ist die Option, die Sie suchen:

ls -lX
Carl Manaster
quelle
13

Bei Bash wird dies eine Art von Arbeit sein:

$ ls | rev | sort | rev

Von man rev:

 The rev utility copies the specified files to the standard output,
 reversing the order of characters in every line.  If no files are speci-
 fied, the standard input is read.

Also 1. ls gibt seine Ausgabe mit beliebigen Flags aus 2. jede Zeile wird umgekehrt 3. dann werden sie sortiert 4. und wieder umgekehrt 5. so:

  1. so was:
  2. Jede Zeile wird umgekehrt
  3. dann sind sie sortiert
  4. und wieder umgekehrt
  5. ls gibt seine Ausgabe mit beliebigen Flags aus

Oder genauer gesagt, wie unten. Sie sind nach dem letzten Zeichen, dann nach dem vorletzten usw. sortiert. Alle .rtf-Dateien werden beispielsweise nach einer .save-Datei und einer anderen Datei ohne Erweiterung, deren Name auf 'e' endet, zusammen aufgelistet. Dann kommen .png-Dateien und so weiter. Dies funktioniert auch mit ls -l, da die Erweiterung normalerweise das letzte Element in der Zeile ist (Ausnahmen sind Zeilen wie "tmp @ -> / home / jones / tmp", in denen auf die Links die Ziele folgen).

$ ls | rev | sort | rev
 cslu1
 ls.mp2
 ls.mp3
 ls.mp4
 trees_110214-15
 KLOPFEN
 CSLU
 Proxy Form.doc
 finannbyid
 toannbyid
 101209ssi.txt.save
 to_annotate_size
 Matas-time-by-week-integration2.rtf
 cyp3.rtf
 data-dir-scan.perl.doc.rtf
 wherece-r21-numid.rtf
 platypus.rtf
 Screenshot 21.01.2011 um 2.17.50 Uhr.png
 emacs print help.png
 Log
 new_month_log
 Besondere
 Google-ngram-critique.html
 perl_path.html
 nl
 DWE_BEN_89808.2.ann
 foo
 doof
 100811_from_iMac_Documents_in_dock.zip
 to-palikir.zip
 tmp
 Dateibereinigung
 Bar
 Daten-Scan-Dokumente
 cmp-mg-ann-numids
 fertigen_numiden
 to_annotate_numids
 manls.ps
 Mike_address_ticket
 cyp2.out
 cyp3.out
 locate-cyp.out
 manls.out
 DWE_BEN_89808.2.text
 tag2.txt
 l2.txt
 du-h-d3.txt
 finished_ann_numids_110407_1714.txt
 finished_all_numids_110407_1718.txt
 data-dir-scan.perl.doc.txt
 wherece-r21-numid.txt
 finannid.txt
 toannid.txt
 b9-workspace-anndiff.txt
 tag.txt
 duh.txt
 do-mail.txt
 safextn.txt
 mg3longhdr.txt
 finished_numids.txt
 41692-langnames.txt
 TimeAnnotationGuidelines.txt
 41langs.txt
 thing4-homedir-links.txt
 bnlinks.txt
 grants.txt
 mata-file-reports.txt
 logx.txt
 logx
 b9-workspace-anndiff.txt ~
 bnlinks.txt ~ 
M. Mandel
quelle
1
Verzeichnisse werden jedoch nicht zuerst aufgelistet.
CarlF
Es wird, wenn Siels -F
Glenn Jackman
+1 für die Mühe ...
Varun
@glennjackman das ist besser. sollte in der Antwort sein.
Stimmen
Es wäre schön (vor allem mit sein -F) , wenn es durch Rohrleitungen revund sorthat die Farbe nicht abstreifen ( -G).
Stimmen
3

Wenn Sie nicht unter Linux sind,

ls -l |sort -d -k 1.1,1.1r -k 9 |awk '{print $9}'

sollte zuerst die Verzeichnisse sortieren (lass es mich wissen, wenn ich falsch liege). Sortiert jedoch nicht nach Erweiterung: Sie müssen die awk-Anweisung viel geschäftiger machen, wenn Sie das tun möchten ...


Um es auch mit Namen zu machen, die Leerzeichen enthalten, würde ich wahrscheinlich die awk durch etwas ersetzen, das sed -E -e 's/([^ ]+[ ]+){8}//'die ersten 8 Felder ausstreift, anstatt das 9. zu drucken

Zac Thompson
quelle
Eigentlich bin ich mir ziemlich sicher, dass dies auch unter Linux funktionieren wird, aber wie andere angegeben haben, haben Sie dort einige eingebaute Unterstützung.
Zac Thompson
1
Funktioniert auf einem Mac. Beachten Sie, dass, wenn Sie CLICOLORdies aktiviert haben, die Färbung entfernt.
Eykanal
1
gibt falsche Ergebnisse für Dateinamen mit Leerzeichen aus.
Glenn Jackman
@glenn, du hast recht ... wenn dies ein Problem wäre, würde ich wahrscheinlich die awk durch etwas ersetzen, das sed -E -e 's/([^ ]+[ ]+){8}//'die ersten 8 Felder ausstreift, anstatt das 9.
Zac Thompson
ls -l |sort -d -k 1.1,1.1r -k 9 | cut -c 50-
Nohillside
2

Wenn Sie unter Linux arbeiten, lsunterstützt GNU die --sortOption: -

ls --sort=extension
DaveR
quelle
Nicht das, wonach gefragt wurde.
Sridhar Sarnobat
0

Ein guter Ansatz besteht darin, zuerst Ordner und dann die sortierten Dateien nach Erweiterungen zu trennen, indem Sie SORTIEREN und UMKEHREN ausführen:

ls -p | grep /;ls -p | grep -v / | rev | sort | rev
PYK
quelle
-1

Ich habe meinem .bashrc (Linux) die Zeile hinzugefügt

alias lx = "ls -X"

Auf diese Weise gebe ich einfach lx ein und sortiere es nach Erweiterung.

user192273
quelle
Die Antwort auf die Frage lautet also use ls -X:)
Andrew
Nicht das, wonach gefragt wurde
Sridhar Sarnobat