Làm thế nào để sắp xếp ls theo phần mở rộng tập tin và sau đó đặt tên?


44

Theo mặc định, lệnh ls sắp xếp chỉ theo tên tệp, nhưng tôi muốn các thư mục xuất hiện trước các loại tệp khác. Tôi thậm chí có thể muốn các tệp được sắp xếp theo tiện ích mở rộng, như cách Windows explorer sắp xếp theo cột loại. Có cách nào để làm một cái gì đó tương tự với ls?

Câu trả lời:


42

Tôi nghĩ rằng câu trả lời đầy đủ là nhiều hơn một sự kết hợp ở trên.

-X (later --sort=extension)đã được hỗ trợ trong Linux vì ít nhất là FC3 và sẽ sắp xếp dựa trên phần mở rộng. --group-directories-firstđã được thêm vào gần đây (có thể khoảng FC8?). Tuy nhiên, kết hợp cả hai dường như không hoạt động (ít nhất là trên FC8).

Vấn đề chính dường như là việc sử dụng các khóa sắp xếp chính đơn lẻ. Xem thảo luận danh sách gửi thư này cho một số cái nhìn sâu sắc về nó.


5
Tôi biết bài đăng này khá cũ, nhưng với những người khác đến đây từ Google (như tôi đã làm): Sự kết hợp --sort=extension--group-directories-first(hoặc duy nhất --group-directories) hoạt động tốt với tôi trên Ubuntu 12.10. Đáng giá một shot trên máy của bạn quá! =)
Tomas Aschan

Có, không có vấn đề gì khi kết hợp -X / --sort=extensionvới --group-directories-firstvà bất cứ điều gì khác mà tôi đã thử trên các bản phân phối Linux hiện đại. OP đang đề cập đến Fedora Core 8 (phát hành năm 2007) vì vậy rất có thể bất kỳ vấn đề nào như vậy đều ở trong quá khứ.
mattst

23

Trên Linux,

$ ls --group-directories-first

( man lslà bạn của bạn!)


1
nâng cấp trong SPITE của bình luận rtfm.
Sridhar Sarnobat

gls --group-directories-firsttrên Mac nếu bạn cài đặt GNU Core utilsqua homebrew
Tới Kra


13

Trên bash, điều này sẽ sắp xếp công việc:

$ ls | rev | sort | rev

Từ 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.

Vì vậy, 1. ls đưa ra đầu ra của nó, với bất kỳ cờ nào bạn muốn 2. mỗi dòng được đảo ngược 3. sau đó chúng được sắp xếp 4. và đảo ngược lại 5. như thế này:

  1. như thế này:
  2. mỗi dòng được đảo ngược
  3. sau đó họ được sắp xếp
  4. và đảo ngược một lần nữa
  5. ls cho đầu ra của nó, với bất kỳ cờ nào bạn muốn

Hoặc, nhiều hơn đến điểm, như dưới đây. Chúng được sắp xếp theo ký tự cuối cùng, sau đó đến cuối cùng, v.v. Tất cả các tệp .rtf, chẳng hạn, được liệt kê cùng nhau, sau tệp .save và một tệp khác không có phần mở rộng có tên kết thúc bằng 'e'. Sau đó đến tập tin .png, v.v. Điều này cũng sẽ hoạt động với ls -l, vì phần mở rộng thường là thứ cuối cùng trên dòng (ngoại trừ nếu bạn có các dòng như "tmp @ -> / home / jones / tmp", trong đó các liên kết được theo sau bởi các mục tiêu của chúng).

$ ls | rev | sắp xếp
 cslu1
 ls.mp2
 ls.mp3
 ls.mp4
 cây_110214-15
 BỆNH NHÂN
 CSLU
 Proxy Form.doc
 finannbyid
 toannbyid
 101209ssi.txt.save
 to_annotate_size
 Matas-time-by-week-integration2.rtf
 cyp3.rtf
 dữ liệu-dir-scan.perl.doc.rtf
 whence-r21-numid.rtf
 thú mỏ vịt.rtf
 Ảnh chụp màn hình 2011-01-21 lúc 2.17.50 PM.png
 in emacs help.png
 đăng nhập
 new_month_log
 đặc biệt
 Google-ngram-critique.html
 perl_path.html
 nl
 DWE_BEN_89808.2.ann
 foo
 dofoo
 100811_from_iMac_Document_in_dock.zip
 to-palikir.zip
 tmp
 dọn dẹp tập tin
 quán ba
 dữ liệu quét dữ liệu
 cmp-mg-ann-chữ số
 finish_numids
 to_annotate_numids
 manls.ps
 Mike_address_ticket
 cyp2.out
 cyp3.out
 định vị-cyp.out
 manls.out
 DWE_BEN_89808.2.text
 tag2.txt
 l2.txt
 du-h-d3.txt
 xong_ann_numids_110407_1714.txt
 xong_all_numids_110407_1718.txt
 data-dir-scan.perl.doc.txt
 whence-r21-numid.txt
 finannid.txt
 toannid.txt
 b9-không gian làm việc-anndiff.txt
 tag.txt
 duh.txt
 do-mail.txt
 safextn.txt
 mg3longhdr.txt
 finish_numids.txt
 41692-langnames.txt
 TimeAnnotationGuiances.txt
 41langs.txt
 thing4-homedir-links.txt
 bnlinks.txt
 Grants.txt
 mata-file-báo cáo.txt
 logx.txt
 logx
 b9-không gian làm việc-anndiff.txt ~
 bnlinks.txt ~ 

1
Sẽ không liệt kê các thư mục đầu tiên, mặc dù.
CarlF

nó sẽ nếu bạnls -F
glenn jackman

+1 cho nỗ lực ...
varun

@glennjackman điều đó tốt hơn. nên có trong câu trả lời
lên tiếng

Sẽ thật tuyệt (đặc biệt là với -F) nếu đường ống xuyên qua rev& sortkhông lột màu ( -G).
lên tiếng

3

Nếu bạn không dùng linux,

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

nên sắp xếp thư mục trước (cho tôi biết nếu tôi sai). Tuy nhiên, không sắp xếp theo tiện ích mở rộng: bạn phải làm cho câu lệnh awk bận rộn hơn rất nhiều nếu bạn muốn làm điều đó ...


Để làm cho nó hoạt động với các tên chứa khoảng trắng, có lẽ tôi sẽ thay thế awk bằng một cái gì đó giống như sed -E -e 's/([^ ]+[ ]+){8}//'loại bỏ 8 trường đầu tiên thay vì in số 9


Trên thực tế, tôi khá chắc chắn rằng điều này cũng sẽ hoạt động trên linux, nhưng như những người khác đã tuyên bố rằng bạn có một số hỗ trợ tích hợp sẵn ở đó.
Zac Thompson

1
Hoạt động trên máy Mac. Lưu ý rằng nếu bạn đã CLICOLORbật, điều này sẽ loại bỏ màu.
Eykanal

1
sẽ cho kết quả không chính xác cho tên tệp có dấu cách.
glenn jackman

@glenn, bạn là đúng ... nếu điều này là một mối quan tâm tôi có lẽ sẽ thay thế awk với một cái gì đó như sed -E -e 's/([^ ]+[ ]+){8}//'để loại bỏ 8 trường đầu tiên thay vì in 9
Zac Thompson

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

2

Nếu bạn đang chạy trên Linux, GNU lshỗ trợ --sorttùy chọn: -

ls --sort=extension

Không phải những gì đã được yêu cầu.
Sridhar Sarnobat

0

Một cách tiếp cận tốt là tách các thư mục lúc đầu, sau đó là các tệp được sắp xếp theo các phần mở rộng , bằng cách sắp xếp theo thứ tự và sắp xếp lại:

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

-1

Tôi đã thêm vào dòng .bashrc (linux) của mình

alias lx = "ls -X"

Bằng cách đó, tôi chỉ cần gõ lx và sắp xếp nó theo phần mở rộng.


Vì vậy, câu trả lời cho câu hỏi là sử dụng ls -X:)
Andrew

Không phải những gì được yêu cầu
Sridhar Sarnobat
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.