Jak sortować ls według rozszerzenia pliku, a następnie nazwy?

44

Domyślnie polecenie ls sortuje według nazwy pliku, ale chcę, aby katalogi pojawiały się przed innymi typami plików. Mogę nawet chcieć sortować pliki według rozszerzeń, tak jak w Eksploratorze Windows sortowanie według kolumny typu. Czy istnieje sposób na zrobienie czegoś podobnego z ls?

cały kod
źródło

Odpowiedzi:

42

Myślę, że pełna odpowiedź jest raczej kombinacją powyższych.

-X (later --sort=extension)jest obsługiwany w Linuksie od co najmniej FC3 i będzie sortować według rozszerzenia. --group-directories-firstzostał dodany niedawno (może około FC8?). Jednak połączenie tych dwóch nie wydaje się działać (przynajmniej na FC8).

Głównym problemem wydaje się być użycie pojedynczych kluczy sortowania podstawowego. Zobacz dyskusję na liście mailowej, aby uzyskać wgląd w nią.

JakeGould
źródło
5
Wiem, że ten post jest raczej stary, ale dla innych, którzy przychodzą tutaj z np. Google'a (tak jak ja): Kombinacja --sort=extensioni --group-directories-first(lub tylko --group-directories) działa dla mnie dobrze na Ubuntu 12.10. Warto też spróbować na swoim komputerze! =)
Tomas Aschan
Tak, nie ma problemu -X / --sort=extensionz połączeniem się z --group-directories-firstczymkolwiek, co wypróbowałem na współczesnych dystrybucjach Linuksa. OP odnosi się do Fedory Core 8 (wydanej w 2007 r.), Więc są szanse, że takie problemy są w odległej przeszłości.
Mattst
23

W systemie Linux

$ ls --group-directories-first

( man lsjest twoim przyjacielem!)

JakeGould
źródło
1
przegłosowano WZGLĘDEM komentarza rtfm.
Sridhar Sarnobat
gls --group-directories-firstna Macu, jeśli instalujesz GNU Core utilsprzez homebrew
To Kra
14

-X to opcja, której szukasz:

ls -lX
Carl Manaster
źródło
13

Na bashu będzie to działać:

$ ls | rev | sort | rev

Od 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.

Więc 1. ls daje wynik, z dowolnymi flagami 2. każda linia jest odwrócona 3. następnie są sortowane 4. i odwrócone 5. w ten sposób:

  1. lubię to:
  2. każda linia jest odwrócona
  3. następnie są sortowane
  4. i ponownie odwrócił So
  5. ls daje wynik, z dowolnymi flagami

Lub bardziej konkretnie, jak poniżej. Są one sortowane według ostatniego znaku, a następnie od ostatniego itd. Na przykład wszystkie pliki .rtf są wyświetlane razem, po pliku .save i innym pliku bez rozszerzenia, którego nazwa kończy się na „e”. Potem przychodzą pliki .png i tak dalej. Będzie to również działać z ls -l, ponieważ rozszerzenie jest zwykle ostatnią rzeczą w linii (wyjątki, jeśli masz linie takie jak „tmp @ -> / home / jones / tmp”, gdzie po linkach znajdują się ich cele).

$ ls | rev | sort | rev
 cslu1
 ls.mp2
 ls.mp3
 ls.mp4
 trees_110214-15
 POKLEPAĆ
 CSLU
 Formularz proxy.doc
 finannbyid
 toannbyid
 101209ssi.txt.save
 to_annotate_size
 Matas-time-by-week -integration2.rtf
 cyp3.rtf
 data-dir-scan.perl.doc.rtf
 whence-r21-numid.rtf
 platypus.rtf
 Zrzut ekranu 21.01.2011 o 2.17.50 PM.png
 emacs print help.png
 log
 nowy_miesiąc_log
 specjalny
 Google-ngram-critique.html
 perl_path.html
 nl
 DWE_BEN_89808.2.ann
 bla
 dofoo
 100811_from_iMac_Documents_in_dock.zip
 to-palikir.zip
 tmp
 czyszczenie plików
 bar
 dokumenty skanowania dokumentów
 cmp-mg-ann-numids
 gotowe_numidy
 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
 zakończeniu_ann_numidów_110407_1714.txt
 zakończeniu_wszystkich_liczników_110407_1718.txt
 data-dir-scan.perl.doc.txt
 whence-r21-numid.txt
 finannid.txt
 toannid.txt
 b9-workspace-anndiff.txt
 tag.txt
 duh.txt
 do-mail.txt
 safextn.txt
 mg3longhdr.txt
 gotowe_numidy.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
źródło
1
Jednak najpierw nie wyświetlałbym katalogów.
CarlF
tak będzie, jeśli tyls -F
glenn jackman
+1 za wysiłek ...
var
@glennjackman, który jest lepszy. powinien być w odpowiedzi.
głosy
Byłoby miło (szczególnie z -F), gdyby przepuszczono go revi sortnie usunięto koloru ( -G).
głosy
3

Jeśli nie korzystasz z systemu Linux,

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

powinien najpierw posortować katalogi (daj mi znać, jeśli się mylę). Jednak nie sortuje według rozszerzenia: jeśli chcesz to zrobić, musisz znacznie zwiększyć obciążenie instrukcji awk ...


Aby również działał z nazwami zawierającymi spacje, prawdopodobnie zastąpiłbym awk czymś takim, jak sed -E -e 's/([^ ]+[ ]+){8}//'usunięcie pierwszych 8 pól zamiast drukowania 9.

Zac Thompson
źródło
właściwie jestem całkiem pewien, że to zadziała również na Linuksie, ale jak inni stwierdzili, masz tam wbudowane wsparcie.
Zac Thompson
1
Działa na komputerze Mac. Pamiętaj, że jeśli włączysz CLICOLORto, usunie kolorowanie.
eykanal 30.03.11
1
da niepoprawne wyniki dla nazw plików ze spacjami.
glenn jackman
@glenn, masz rację ... gdyby to była obawa, prawdopodobnie zastąpiłbym awk czymś w rodzaju sed -E -e 's/([^ ]+[ ]+){8}//'rozebrania pierwszych 8 pól zamiast drukowania 9
Zac Thompson
ls -l |sort -d -k 1.1,1.1r -k 9 | cut -c 50-
nohillside
2

Jeśli pracujesz w systemie Linux, GNU lsobsługuje --sortopcję: -

ls --sort=extension
DaveR
źródło
Nie o to poproszono.
Sridhar Sarnobat
0

Dobrym podejściem jest najpierw oddzielenie folderów , a następnie posortowanie plików według rozszerzeń , SORTOWANIE i ODWRÓCENIE:

ls -p | grep /;ls -p | grep -v / | rev | sort | rev
PYK
źródło
-1

Dodałem do mojego .bashrc (linux) linię

alias lx = "ls -X"

w ten sposób po prostu wpisuję lx i sortuję według rozszerzenia.

użytkownik192273
źródło
Tak więc odpowiedzią na to pytanie jest użycie ls -X:)
Andrew
Nie o to poproszono
Sridhar Sarnobat