'ls' ของ Unix จัดเรียงตามชื่อ


127

คุณสามารถจัดเรียงรายการlsตามชื่อได้หรือไม่?


10
หากไม่ได้จัดเรียงตามชื่อโดยไม่มีข้อโต้แย้งใด ๆ คุณอาจต้องการตรวจสอบว่า ls ถูกใช้นามแฝงเป็นอย่างอื่นหรือไม่หรือเพียงแค่เรียกใช้โดยใช้เส้นทางแบบเต็มซึ่งจะกำจัดนามแฝงที่มีอยู่
tvanfosson

gnu-coreutils ls เรียงตามค่าเริ่มต้น คุณใช้ระบบอะไร (ตามที่คนอื่นถาม)
Nick Fortescue

คุณแน่ใจหรือไม่ว่าการขอเรียงตามชื่อไม่ใช่ตามประเภท (เช่นไดเร็กทอรีก่อนตามด้วยไฟล์)
curtisk

ตัวพิมพ์ใหญ่มาก่อนอักษรตัวพิมพ์เล็กดังนั้นไฟล์ Z จึงมาก่อนไฟล์ a ... ฉันจะแก้ไขได้อย่างไร
ArtOfWarfare

หน้าคนพูดว่า 'จัดเรียงแยกต่างหากและตามลำดับศัพท์' ไฟล์ถูกจัดเรียงตามอักขระตัวแรก: ตัวเลข [0..9] และอักขระ UPPER [A..Z] และอักขระต่ำ [a..z]
Gürol Canbek

คำตอบ:


131

ls ของฉันเรียงตามชื่อโดยค่าเริ่มต้น คุณเห็นอะไรบ้าง?

man ls รัฐ:

List information about the FILEs (the current directory by default). Sort entries alpha‐betically if none of -cftuvSUX nor --sort is specified.:


lsไม่เรียงลำดับหาก-c1ระบุ: มีวิธีทำให้ทำได้หรือไม่? ( --sort=nameดูเหมือนจะใช้ไม่ได้)
dhc

1
นั่นไม่เป็นความจริง ด้วยls -laฉันเห็น: .bashrc - can - .config - Downloads - .local - tmpเรียงลำดับเป็นชื่อจะเป็น:.bashrc - .config - .local - Downloads - can - tmp
12431234123412341234123

1
ของฉันบอกว่า 100.jpg มาก่อน 10.jpg สมเหตุสมผลแล้วฉันเดาว่า "0" มาก่อน "" แต่มันยังไม่เข้าใจง่าย
ChiliNUT

ฉันเห็น "M" ก่อน "b" สับสน. เดี๋ยวก่อนการใช้อักษรตัวพิมพ์ใหญ่มีความสำคัญหรือไม่?
Daniel Springer

106

หาสิ่งที่ง่ายคุณสามารถรวมคำสั่ง lsกับการจัดเรียง สำหรับรายชื่อไฟล์เท่านั้น:
ls -1 | ประเภท

ในการเรียงลำดับย้อนกลับ:
ls -1 | เรียงลำดับ -r


3
มีวิธีจัดเรียงไฟล์ดังนี้ls | sort -n 1.1.1; 1.1.2; 1.1.3; 2.10.1; 2.10.15; 2.10.2; 2.10.20; 2.10.21; 2.1.1; 2.1.10; 2.1.15; 2.1.2; 2.1.3; 2.1.4; 10.1.1; 10.1.2; 10.1.3; 11.0.1; 11.0.2; 11.0.20; 11.0.21; 11.0.22; ที่คุณสามารถดู2.10.15 ก่อน 2.10.2
BBK

ฉันกำลังพัฒนา Android บนอุปกรณ์ Pidion และ ls ไม่ได้เรียงลำดับโดยอัตโนมัติดังนั้นสิ่งนี้จึงมีประโยชน์มาก! ปัญหาเดียวคือดูเหมือนว่ามันจะเรียงลำดับซอฟต์ลิงก์ แต่ไม่ได้เรียงไฟล์ด้วยเหตุผลบางประการ
มิทช์

บน Mac ดูเหมือนว่าคำสั่งที่สองสามารถย่อให้สั้นลงls -1rได้
Ash Ryan Arnwine

4
@BBK sort -V จะเรียงลำดับตามหมายเลขเวอร์ชันดังนั้นคุณจะได้ .. 2.10.2; 2.10.15; .. from man sort .. --sort = WORD จะเรียงตาม WORD: general-numeric -g, human-numeric -h, month -M, numeric -n, random -R, version -V
mosh

35

lsจากcoreutilsดำเนินการจัดเรียงที่ทราบตำแหน่งที่ตั้งตามค่าเริ่มต้นดังนั้นจึงอาจให้ผลลัพธ์ที่น่าแปลกใจในบางกรณี (เช่น%fooจะเรียงลำดับระหว่างbarและquuxในLANG=en_US) หากคุณต้องการจัดเรียง ASCIIbetical ให้ใช้

LANG=C ls

LANGความไม่เหมาะสมของพฤติกรรมการจัดเรียงโพสต์นี้ช่วยฉันได้มาก!
yurenchen

สิ่งนี้ได้ผลสำหรับฉันเช่นกัน คุณช่วยอธิบายให้ละเอียดได้ไหม ทำไมเรียงลำดับไม่เหมือนกัน
Kostas

1
ปริมาณนี้ใช้งานได้ แต่จะส่งออก?สำหรับอักขระที่ไม่ใช่ ascii ทุกตัวเมื่อเอาต์พุตเป็นเทอร์มินัล (คุณลักษณะที่ไม่ดีจาก ls จะตรวจสอบว่าเอาต์พุตไปยังเทอร์มินัลทำงานเมื่อท่อ) คุณสามารถ "แก้ไข" สิ่งนี้ด้วย piping to cat ใช้C.UTF-8โลแคล (หากระบบของคุณรองรับ) และ / หรือใช้-bแฟล็ก ยิ่งไปกว่านั้นอย่าใช้lsเลยดีกว่าใช้ '
12431234123412341234123

สิ่งนี้ช่วยให้ฉันค้นพบว่าสำหรับฉันปัญหาคือชื่อไฟล์บางชื่อของฉันมียัติภังค์ (-) และมีเครื่องหมายขีดกลาง (-) lsจัดเรียงยัติภังค์ก่อนขีดคั่น
Jamy Mahabier

17

ความสวยงามของเครื่องมือ * nix คือคุณสามารถรวมเข้าด้วยกัน:

ls -l | sort -k9,9

ผลลัพธ์ของls -lจะมีลักษณะเช่นนี้

-rw-rw-r-- 1 luckydonald luckydonald  532 Feb 21  2017 Makefile
-rwxrwxrwx 1 luckydonald luckydonald 4096 Nov 17 23:47 file.txt

ดังนั้นเมื่อ9,9คุณจัดเรียงคอลัมน์9ไปยังคอลัมน์9เป็นชื่อไฟล์ คุณต้องระบุตำแหน่งที่จะหยุดซึ่งเป็นคอลัมน์เดียวกันในกรณีนี้ คอลัมน์เริ่มต้นด้วย1.

นอกจากนี้หากคุณต้องการละเว้นตัวพิมพ์ใหญ่ / เล็กให้เพิ่ม--ignore-caseคำสั่ง sort


1
อะไร-k9,9หมายถึง?
luckydonald

พบว่ามันหมายถึงการเรียงลำดับคอลัมน์ถึงคอลัมน์เดียวกัน9 ผลลัพธ์9ปกติlsจะมีลักษณะดังนี้drwx------ 8 999 user 4.0K Feb 5 2017 file.txtดังนั้นคอลัมน์ 9 จึงเป็นชื่อไฟล์ หากคุณต้องการละเว้นกรณีนี้ให้ใช้--ignore-caseในการจัดเรียง
luckydonald

8

ข้อสังเกต: "a" มาหลังจาก "Z":

$ touch A.txt aa.txt Z.txt

$ ls

ก. txt Z.txt aa.txt


3
นี่ไม่ใช่เรื่องจริงเสมอไป ฉันไม่รู้ว่าสถานการณ์ที่ทำให้สิ่งนี้ไม่เป็นความจริง แต่ในเครื่องของฉันที่ใช้ Ubuntu 12.04 เอาต์พุตของ ls จะเรียงตามตัวอักษร (ไม่สนใจตัวพิมพ์เล็กและใหญ่)
Patrick James McDougle

จับดี! ดูเหมือนว่าจะเรียงลำดับตามรหัส ASCII .. ตัวอักษรตัวพิมพ์ใหญ่ตามด้วยตัวพิมพ์เล็ก ..
Kent Pawar

1
ฉันสังเกตเห็นว่า MacOS ของฉันจะเรียงลำดับตัวเลขแรกจากนั้นจึงเป็นตัวอักษรตัวพิมพ์ใหญ่จากนั้นขีดล่างและตัวอักษรพิมพ์เล็ก มันตลกที่พวกเขาไม่พิจารณาตัวพิมพ์เล็กและใหญ่ ในทางกลับกัน Debian ของฉันเป็นตัวพิมพ์เล็กและตัวพิมพ์เล็ก แต่จะเรียงลำดับตัวอักษรอย่างไม่ใส่ใจเว้นแต่จะมีการเสมอกันตัวพิมพ์เล็กจะชนะ! ตัวอย่าง: ABA.txt ABb.txt aBC.txt AbC.txt ABc.txt
zk82

ฉันใช้ MAC ด้วย ฉันรู้สึกผิดหวังที่เห็นการเรียงลำดับประเภท A, Z, a, z ฉันมาที่นี่เพราะฉันชอบที่จะมี A, a, Z, a ขอบคุณสำหรับคำแนะนำของคุณ จะลองnormalแก้ปัญหาที่นี่
nyxee

8

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

ในกรณีนี้สามารถใช้ไวยากรณ์ต่อไปนี้:

ls -x1 file | sort -t'<char>' -n -k2

ตัวอย่าง:

ls -1 TRA*log | sort -t'_' -n -k2

TRACE_1.log
TRACE_2.log
TRACE_3.log
TRACE_4.log
TRACE_5.log
TRACE_6.log
TRACE_7.log
TRACE_8.log
TRACE_9.log
TRACE_10.log

4

จากหน้าคน (สำหรับ bash ls):

จัดเรียงรายการตามตัวอักษรหากไม่มี -cftuSUX หรือ --sort


3
ไม่มี "bash ls" Do "which ls"
Norbert Hartl

@ Norbert: คุณถูกต้อง แต่which lsจะประสบความสำเร็จแม้ว่า bash จะมี builtin ls แต่ทำbuiltin lsใน bash และได้รับข้อผิดพลาด
Pianosaurus

4
@ Norbert: whichส่งกลับเส้นทางเสมอ ใช้type lsเพื่อพิจารณาว่าเชลล์คิดว่าlsคืออะไร (ในตัว, ฟังก์ชัน, ปฏิบัติการได้)
ephemient

3

lsประโยชน์ควรเป็นไปตามมาตรฐาน IEEE Std 1,003.1-2,001 ( POSIX.1) ซึ่งสหรัฐฯ:

22027: จะเรียงลำดับไดเร็กทอรีและตัวถูกดำเนินการที่ไม่ใช่ไดเร็กทอรีแยกกันตามลำดับการเรียงในโลแคลปัจจุบัน

26027: โดยค่าเริ่มต้นรูปแบบจะไม่ระบุ แต่ผลลัพธ์จะถูกเรียงลำดับตามตัวอักษรตามชื่อสัญลักษณ์:

  • ชื่อไลบรารีหรืออ็อบเจ็กต์หากระบุ −A
  • ชื่อสัญลักษณ์
  • ประเภทสัญลักษณ์
  • มูลค่าของสัญลักษณ์
  • ขนาดที่เกี่ยวข้องกับสัญลักษณ์หากมี


2

ls -X ทำงานเพื่อจุดประสงค์นั้นในกรณีที่คุณมีนามแฝง ls เป็นค่าเริ่มต้นที่มีประโยชน์มากขึ้น


0
In Debian Jessie, this works nice:

ls -lah --group-directories-first

# l=use a long listing format
# a=do not ignore entries starting with .
# h=human readable
# --group-directories-first=(obvious)
# Note: add -r for reverse alpha

# You might consider using lh by appending to ~/.bashrc as the alias:
~$ echo "alias lh='ls -lah --group-directories-first'" >>~/.bashrc
# -- restart your terminal before using lh command --
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.