Bagaimana membuat ls urutkan berdasarkan ekstensi file dan kemudian beri nama?


44

Secara default perintah ls mengurutkan hanya dengan nama file, tetapi saya ingin direktori muncul sebelum jenis file lainnya. Saya bahkan mungkin ingin file diurutkan berdasarkan ekstensi, seperti cara Windows explorer mengurutkan berdasarkan kolom jenis. Apakah ada cara untuk melakukan sesuatu yang mirip dengan ls?

Jawaban:


42

Saya pikir jawaban yang lengkap lebih merupakan kombinasi dari yang di atas.

-X (later --sort=extension)telah didukung di Linux sejak setidaknya FC3 dan akan disortir berdasarkan ekstensi. --group-directories-firsttelah ditambahkan baru-baru ini (mungkin sekitar FC8?). Namun, menggabungkan keduanya sepertinya tidak berhasil (setidaknya pada FC8).

Masalah utama tampaknya dengan penggunaan kunci sorting primer tunggal. Lihat diskusi milis ini untuk beberapa wawasan tentangnya.


5
Saya tahu posting ini agak lama, tetapi untuk orang lain yang datang ke sini dari misalnya Google (seperti yang saya lakukan): Kombinasi --sort=extensiondan --group-directories-first(atau hanya --group-directories) berfungsi dengan baik untuk saya di Ubuntu 12.10. Layak dicoba di komputer Anda juga! =)
Tomas Aschan

Ya, tidak ada masalah -X / --sort=extensiondengan penggabungan --group-directories-firstdan hal lain yang saya coba di distro Linux modern. OP mengacu pada Fedora Core 8 (dirilis 2007) sehingga kemungkinan ada masalah seperti itu di masa lalu yang jauh.
Mattst

23

Di Linux,

$ ls --group-directories-first

( man lsadalah temanmu!)


1
DITUTUPKAN DI SPITE dari komentar rtfm.
Sridhar Sarnobat

gls --group-directories-firstpada Mac jika Anda menginstal GNU Core utilslebih dari homebrew
To Kra


13

Pada bash, ini akan berfungsi:

$ ls | rev | sort | rev

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

Jadi 1. ls memberikan outputnya, dengan flag apa pun yang Anda inginkan 2. setiap baris dibalik 3. lalu disortir 4. dan dibalik 5. seperti ini:

  1. seperti ini:
  2. setiap baris dibalik
  3. kemudian mereka disortir
  4. dan dibalik lagi Jadi
  5. ls memberikan outputnya, dengan semua flag yang Anda inginkan

Atau, lebih tepatnya, seperti di bawah ini. Mereka diurutkan berdasarkan karakter terakhir, lalu ke yang terakhir, dll. Semua file .rtf, misalnya, didaftar bersama, setelah file .save dan file lain tanpa ekstensi yang namanya berakhir dengan 'e'. Kemudian datang file .png, dan sebagainya. Ini juga akan bekerja dengan ls-l, karena ekstensi biasanya adalah hal terakhir pada baris (pengecualian jika Anda memiliki baris seperti "tmp @ -> / home / jones / tmp", di mana tautan diikuti oleh target mereka).

$ ls | rev | sort | rev
 cslu1
 ls.mp2
 ls.mp3
 ls.mp4
 trees_110214-15
 MENEPUK
 CSLU
 Formulir Proksi.doc
 finannbyid
 toannbyid
 101209ssi.txt.save
 to_annotate_size
 Matas-waktu-per-minggu-integrasi2.rtf
 cyp3.rtf
 data-dir-scan.perl.doc.rtf
 whence-r21-numid.rtf
 platypus.rtf
 Cuplikan layar 2011-01-21 pada 2.17.50 PM.png
 emacs print help.png
 log
 new_month_log
 khusus
 Google-ngram-critique.html
 perl_path.html
 nl
 DWE_BEN_89808.2.ann
 foo
 dofoo
 100811_from_iMac_Documents_in_dock.zip
 to-palikir.zip
 tmp
 pembersihan file
 bar
 data-scan-docs
 cmp-mg-ann-numids
 selesai_numid
 to_annotate_numids
 manls.ps
 Mike_address_ticket
 cyp2.out
 cyp3.out
 cari-cyp.out
 manls.out
 DWE_BEN_89808.2.text
 tag2.txt
 l2.txt
 du-h-d3.txt
 selesai_ann_numids_110407_1714.txt
 selesai_all_numids_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
 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 ~ 

1
Namun, tidak akan mendaftar direktori terlebih dahulu.
CarlF

itu akan terjadi jika Andals -F
glenn jackman

+1 untuk upaya ini ...
varun

@glennjackman itu lebih baik. harus dalam jawabannya.
suara

Akan lebih baik (terutama dengan -F) jika menyalurkannya melalui rev& sorttidak menghilangkan warna ( -G).
Suara

3

Jika Anda tidak menggunakan linux,

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

harus mengurutkan direktori terlebih dahulu (beri tahu saya jika saya salah). Tidak mengurutkan berdasarkan ekstensi: Anda harus membuat pernyataan awk menjadi lebih sibuk jika Anda ingin melakukan itu ...


Untuk membuatnya berfungsi dengan nama yang berisi spasi, saya mungkin akan mengganti awk dengan sesuatu seperti sed -E -e 's/([^ ]+[ ]+){8}//'menghapus 8 bidang pertama alih-alih mencetak tanggal 9


sebenarnya, saya cukup yakin ini akan bekerja di linux juga, tetapi karena orang lain telah menyatakan Anda memiliki beberapa dukungan bawaan di sana.
Zac Thompson

1
Bekerja pada Mac. Perhatikan bahwa jika Anda telah CLICOLORmengaktifkan ini akan menghapus pewarnaan.
eykanal

1
akan memberikan hasil yang salah untuk nama file dengan spasi.
glenn jackman

@ Glenn, Anda benar ... jika ini adalah masalah saya mungkin akan mengganti awk dengan sesuatu yang ingin sed -E -e 's/([^ ]+[ ]+){8}//'menghapus 8 bidang pertama alih-alih mencetak tanggal 9
Zac Thompson

ls -l |sort -d -k 1.1,1.1r -k 9 | cut -c 50-
nohillside


0

Pendekatan yang baik adalah memisahkan folder pada awalnya, lalu mengurutkan file berdasarkan ekstensi , dengan MENGURANGI dan MEMBACA:

ls -p | grep /;ls -p | grep -v / | rev | sort | rev

-1

Saya menambahkan baris .bashrc (linux) saya

alias lx = "ls -X"

dengan begitu saya cukup mengetik lx dan memilahnya berdasarkan ekstensi.


Jadi jawaban untuk pertanyaan ini adalah gunakan ls -X:)
Andrew

Bukan apa yang diminta
Sridhar Sarnobat
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.