Ls dosya uzantısına ve daha sonra isme göre nasıl sıralanır?


44

Varsayılan olarak, ls komutu sadece dosya adına göre sıralanır, ancak dizinlerin diğer dosya türlerinden önce görünmesini istiyorum. Windows explorer'ın tür sütununa göre sıraladığı gibi, dosyaların uzantıya göre sıralanmasını bile isteyebilirim. Ls ile benzer bir şey yapmanın bir yolu var mı?

Yanıtlar:


42

Bence cevabın tamamı yukarıdakilerin bir birleşimidir.

-X (later --sort=extension)Linux’ta en az FC3’den beri destekleniyor ve uzantıyı temel alarak sıralama yapıyor. --group-directories-firstdaha yakın zamanda eklenmiştir (belki FC8 civarında?). Bununla birlikte, ikisinin birleştirilmesi işe yaramaz gibi görünüyor (en azından FC8'de).

Birincil mesele, tekil birincil sıralama tuşlarının kullanılması ile görünüyor. Bazı içgörüler için bu posta listesi tartışmasına bakın .


5
Kombinasyonu: Bu yazı oldukça eski, ama (benim yaptığım gibi) mesela Google'dan buraya gelen başkaları bilmek --sort=extensionve --group-directories-first(veya tek --group-directories) Ubuntu 12.10 benim için ceza çalışır. Makinenizde bir atış değer! =)
Tomas Aschan

Evet hiçbir birleştirerek sorun -X / --sort=extensionile --group-directories-firstve başka bir şey Modern Linux dağıtımları üzerinde denedim. OP, Fedora Core 8'e (2007 yayınlandı) atıfta bulunuyor, bu yüzden bu tür sorunlar uzak geçmişte kaldı.
Matt

23

Linux'ta

$ ls --group-directories-first

( man lsarkadaşın!)


1
rtfm yorum SPITE INVOTED.
Sridhar Sarnobat

gls --group-directories-firstEğer GNU Core utilshomebrew üzerine yüklerseniz Mac on
Kra


13

Bash, bu işe yarayacak:

$ ls | rev | sort | rev

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

Yani 1. ls çıktısını verir, istediğin bayraklarla 2. her satır tersine çevrilir 3. sonra sıralanırlar ve tekrar tersine döndürülürler 5. böyle:

  1. bunun gibi, böyle:
  2. her satır ters
  3. o zaman sıralanırlar
  4. ve tekrar tersine döndü
  5. ls, istediğiniz bayrakla birlikte çıktılarını verir

Veya, aşağıdaki noktaya daha fazla. Son karaktere, sonra sonuncuya vb. Göre sıralanırlar. Örneğin, .rtf dosyalarının tümü, bir .save dosyasından ve adı 'e' ile biten bir uzantıya sahip olmayan başka bir dosyadan sonra birlikte listelenir. Ardından .png dosyaları vb. Bu, ls -l ile de çalışacaktır, çünkü uzantı normalde satırdaki son şeydir ("tmp @ -> / home / jones / tmp" gibi satırlara sahipseniz, bağlantıların hedeflerinin takip ettiği istisnalar).

$ ls | rev | sıralamak | rev
 cslu1
 ls.mp2
 ls.mp3
 ls.mp4
 trees_110214-15
 PAT
 CSLU
 Proxy Form.doc
 finannbyid
 toannbyid
 101209ssi.txt.save
 to_annotate_size
 Matas zamanlı tarafından haftalık integration2.rtf
 cyp3.rtf
 Veri-dir-scan.perl.doc.rtf
 nereye-R21-numid.rtf
 platypus.rtf
 Ekran görüntüsü 2011-01-21 at 2.17.50 PM.png
 emac baskı yardım.png
 günlük
 new_month_log
 özel
 Google Ngram-critique.html
 perl_path.html
 nl
 DWE_BEN_89808.2.ann
 varsayılan değer
 dofoo
 100811_from_iMac_Documents_in_dock.zip
 to-palikir.zip
 tmp
 dosya temizleme
 bar
 veri tarama docs
 cmp mg-ann-numids
 finished_numids
 to_annotate_numids
 manls.ps
 Mike_address_ticket
 cyp2.out
 cyp3.out
 bulun-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
 Veri-dir-scan.perl.doc.txt
 nereye-R21-numid.txt
 finannid.txt
 toannid.txt
 B9-çalışma-anndiff.txt
 tag.txt
 duh.txt
 do-mail.txt
 safextn.txt
 mg3longhdr.txt
 finished_numids.txt
 41.692-langnames.txt
 TimeAnnotationGuidelines.txt
 41langs.txt
 thing4-homedir-links.txt
 bnlinks.txt
 grants.txt
 mata-file-reports.txt
 logx.txt
 logX
 B9-çalışma-anndiff.txt ~
 bnlinks.txt ~ 

1
Yine de ilk önce dizinleri listelemezdi.
CarlF

eğer olacakls -F
glenn jackman

Çaba için +1 ...
varun

@glennjackman bu daha iyi. cevabında olmalı.
sesleri

Güzel (özellikle birlikte olacağını -Faracılığıyla boru ise) rev& sort(renk şerit vermedi -G).
sesleri

3

Eğer Linux’ta değilseniz,

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

önce dizinleri sıralamalıyım (yanılıyorsam bana haber ver). Yine de, uzantıya göre sıralamıyor: Bunu yapmak istiyorsanız, awk ifadesini çok daha yoğun hale getirmek zorundasınız ...


Ayrıca boşluk içeren isimlerle çalışmasını sağlamak için, muhtemelen awk'yi sed -E -e 's/([^ ]+[ ]+){8}//'9. basımı yapmak yerine ilk 8 alanı çıkarmak gibi bir şeyle değiştirirdim.


Aslında, bunun Linux üzerinde de çalışacağından eminim, ancak diğerlerinin de belirttiği gibi orada bir miktar destek var.
Zac Thompson

1
Mac üzerinde çalışır. Bunu CLICOLORaçtıysanız, bunun renklendirmeyi kaldıracağını unutmayın.
eykanal

1
boşluk içeren dosya isimleri için yanlış sonuçlar verecektir.
glenn jackman

@glenn, haklısın ... eğer bu bir endişe olsaydı, muhtemelen awk’i sed -E -e 's/([^ ]+[ ]+){8}//', 9’u basmak yerine ilk 8 alanı çıkarmak gibi bir şeyle değiştirirdim
Zac Thompson

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

2

Linux'ta çalışıyorsanız, GNU seçeneği lsdesteklemektedir --sort: -

ls --sort=extension

Bunun için istendi değil.
Sridhar Sarnobat

0

İyi bir yaklaşım ilk önce klasörleri , ardından sıralanan dosyaları , SIRALAMA ve TERSLEME yoluyla uzantılara göre ayırmaktır :

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

-1

.Bashrc (linux) satırımı ekledim

alias lx = "ls -X"

bu şekilde sadece lx yazıp uzantıya göre sıralıyorum.


Yani sorunun cevabı kullanım ls -X:)
Andrew

Ne için istendi değil
Sridhar Sarnobat
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.