วิธีทำ ls เรียงตามนามสกุลไฟล์แล้วชื่อ?


44

โดยค่าเริ่มต้นคำสั่ง ls จะเรียงลำดับตามชื่อไฟล์ แต่ฉันต้องการให้ไดเรกทอรีปรากฏก่อนประเภทไฟล์อื่น ฉันอาจต้องการเรียงไฟล์ตามนามสกุลเช่นวิธีที่ Windows explorer จัดเรียงตามคอลัมน์ชนิด มีวิธีการทำสิ่งที่คล้ายกับ ls หรือไม่?

คำตอบ:


42

ฉันคิดว่าคำตอบที่สมบูรณ์คือการรวมกันของข้างต้น

-X (later --sort=extension)ได้รับการสนับสนุนใน Linux ตั้งแต่ FC3 เป็นอย่างน้อยและจะเรียงลำดับตามส่วนขยาย --group-directories-firstได้รับการเพิ่มเมื่อเร็ว ๆ นี้ (อาจประมาณ FC8?) อย่างไรก็ตามการรวมสองสิ่งนี้เข้ากันไม่ได้ (อย่างน้อยใน FC8)

ปัญหาหลักดูเหมือนว่าจะมีการใช้คีย์การเรียงลำดับหลักเอกพจน์ ดูการสนทนารายชื่อผู้รับจดหมายนี้เพื่อรับข้อมูลเชิงลึก


5
ฉันรู้ว่าโพสต์นี้ค่อนข้างเก่า แต่สำหรับคนอื่น ๆ ที่มาที่นี่เช่น Google (เหมือนที่ฉันทำ): การรวมกันของ( --sort=extensionและ--group-directories-firstเท่านั้น--group-directories) ทำงานได้ดีสำหรับฉันใน Ubuntu 12.10 คุ้มค่ากับการยิงบนเครื่องของคุณเช่นกัน! =)
Tomas Aschan

ใช่ไม่มีปัญหาในการรวม-X / --sort=extensionกับ--group-directories-firstและสิ่งอื่น ๆ ที่ฉันได้ลองใน distros Linux ที่ทันสมัย OP อ้างถึง Fedora Core 8 (เปิดตัวในปี 2007) ดังนั้นโอกาสที่จะเกิดปัญหาดังกล่าวนั้นเกิดขึ้นในอดีตอันไกลโพ้น
mattst



13

ในทุบตีนี้จะทำงาน:

$ ls | rev | sort | rev

จาก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.

ดังนั้น 1. ls ให้เอาต์พุตโดยมีแฟล็กใด ๆ ที่คุณต้องการ 2. แต่ละบรรทัดกลับด้าน 3. จากนั้นพวกเขาเรียงลำดับ 4. และกลับรายการอีกครั้ง 5. เช่นนี้:

  1. แบบนี้:
  2. แต่ละบรรทัดกลับด้าน
  3. จากนั้นพวกเขากำลังเรียง
  4. และกลับรายการอีกครั้งดังนั้น
  5. ls ให้เอาต์พุตกับแฟล็กใด ๆ ที่คุณต้องการ

หรือมากกว่านั้นตามด้านล่าง ตัวอย่างเช่นไฟล์เหล่านี้เรียงลำดับตามตัวอักษรตัวสุดท้ายจากนั้นเรียงลำดับถัดไปเป็นต้นไฟล์. rtf ทั้งหมดจะแสดงรายการร่วมกันหลังจากไฟล์. ssave และไฟล์อื่น ๆ ที่ไม่มีนามสกุลลงท้ายด้วย 'e' จากนั้นมาไฟล์. png และอื่น ๆ สิ่งนี้จะทำงานกับ ls -l ด้วยเช่นกันเพราะส่วนขยายเป็นสิ่งสุดท้ายในบรรทัด (ยกเว้นถ้าคุณมีบรรทัดเช่น "tmp @ -> / home / jones / tmp" ซึ่งลิงก์จะตามด้วยเป้าหมาย)

$ ls | รอบ | เรียงลำดับ | รอบ
 cslu1
 ls.mp2
 ls.mp3
 ls.mp4
 trees_110214-15
 กทท.
 CSLU
 แบบฟอร์มมอบฉันทะ
 finannbyid
 toannbyid
 101209ssi.txt.save
 to_annotate_size
 Matas เวลาโดยสัปดาห์ integration2.rtf
 cyp3.rtf
 data-dir-scan.perl.doc.rtf
 ไหน-R21-numid.rtf
 platypus.rtf
 สกรีนช็อต 2011-01-21 เวลา 2.17.50 น
 emacs print help.png
 บันทึก
 new_month_log
 พิเศษ
 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
 ไฟล์ล้าง
 บาร์
 ข้อมูลการสแกนเอกสาร
 CMP-MG-Ann-numids
 finished_numids
 to_annotate_numids
 manls.ps
 Mike_address_ticket
 cyp2.out
 cyp3.out
 ค้นหา-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
 ไหน-R21-numid.txt
 finannid.txt
 toannid.txt
 b9-พื้นที่ทำงาน-anndiff.txt
 tag.txt
 duh.txt
 ทำ 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-ไฟล์ reports.txt
 logx.txt
 logx
 b9-พื้นที่ทำงาน-anndiff.txt ~
 bnlinks.txt ~ 

1
จะไม่แสดงรายการไดเรกทอรีก่อน
CarlF

มันจะถ้าคุณls -F
เกล็นแจ็คแมน

+1 สำหรับความพยายาม ...
varun

@glennjackman ดีกว่า ควรอยู่ในคำตอบ
เสียง

มันจะดี (โดยเฉพาะอย่างยิ่งกับ-F) ถ้าท่อผ่านrev& sortไม่ได้ตัดสี ( -G)
เสียง

3

หากคุณไม่ได้อยู่ใน linux

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

ควรเรียงลำดับไดเรกทอรีก่อน (แจ้งให้เราทราบหากฉันผิด) ไม่ได้เรียงตามส่วนขยาย แต่คุณต้องทำให้คำสั่ง awk ยุ่งมากขึ้นหากคุณต้องการทำเช่นนั้น ...


เพื่อให้ทำงานกับชื่อที่มีช่องว่างฉันอาจแทนที่ awk ด้วยสิ่งที่ต้องการsed -E -e 's/([^ ]+[ ]+){8}//'ตัดออกจาก 8 ช่องแรกแทนการพิมพ์ที่ 9


ที่จริงฉันค่อนข้างมั่นใจว่ามันจะทำงานบน linux เช่นกัน แต่ตามที่คนอื่น ๆ ระบุว่าคุณมีการสนับสนุนในตัวที่นั่น
Zac Thompson

1
ทำงานบน Mac โปรดทราบว่าหากคุณCLICOLORเปิดใช้งานสิ่งนี้จะเป็นการลบสีออก
eykanal

1
จะให้ผลลัพธ์ที่ไม่ถูกต้องสำหรับชื่อไฟล์ที่มีช่องว่าง
เกล็นแจ็คแมน

@glenn คุณพูดถูก ... ถ้าเป็นกังวลฉันอาจจะแทนที่ awk ด้วยสิ่งที่ต้องการsed -E -e 's/([^ ]+[ ]+){8}//'ตัดออก 8 ช่องแรกแทนที่จะพิมพ์ 9
Zac Thompson

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


0

วิธีที่ดีคือการแยกโฟลเดอร์ในตอนแรกจากนั้นจัดเรียงไฟล์ตามส่วนขยายโดยการเรียงลำดับและย้อนกลับ:

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

-1

ฉันเพิ่มของฉัน. bashrc (linux) บรรทัด

alias lx = "ls -X"

ฉันพิมพ์ lx และทำให้มันเรียงตามนามสกุล


ดังนั้นคำตอบของคำถามคือการใช้ls -X:)
แอนดรู

ไม่ใช่สิ่งที่ถูกขอ
Sridhar Sarnobat
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.