ฉันจะทำให้“ ls” แสดงดอทไฟล์ได้อย่างไร?


46

อยู่ที่ไหนสักแห่งระหว่างที่ฉันเมาคำสั่ง ls และตอนนี้ฉันได้รับคำสั่งนี้เมื่อทำงาน

$ ls -AhHl --color=auto
-rwxr-xr-x 1 clang clang  640 Mar  1 02:46 apple-touch-icon-precomposed.png
-rwxr-xr-x 1 clang clang  784 Jul 12 02:54 crossdomain.xml
-rwxr-xr-x 1 clang clang 1.2K Mar  1 02:46 favicon.ico
drwxr-xr-x 8 clang clang 4.0K Jul 12 23:50 .git
-rw-r--r-- 1 clang clang   17 Feb 29 19:48 .gitignore
-rwxr-xr-x 1 clang clang 1.4K Jul 12 02:54 humans.txt

ฉันทำอะไรที่ทำให้ ls เพิกเฉยต่อ dotfiles และสั่งแทนด้วยอักษรตัวแรกแทน?

ผลลัพธ์ของlocale:

$ locale
LANG=
LANGUAGE=
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=en_US.UTF-8

คำตอบ:


47

ลองเพิ่ม

export LC_COLLATE="C"

ใน dotfiles ของคุณหรือเปลี่ยนการLC_ALLมอบหมายเป็น:

export LC_ALL="C"

สิ่งนี้จะควบคุมวิธีการเรียงลำดับตามระดับอักขระในขณะที่ค่าเริ่มต้นคือการเรียงลำดับ dotfiles แบบอินไลน์สิ่งนี้จะทำให้sortรายการ dotfiles เป็นอันดับแรก

อย่างไรก็ตามโปรดทราบว่าการดำเนินการนี้จะหยุดการสนับสนุนสถานที่จริงของคุณในทุกระบบสาธารณูปโภคที่ทราบถึงสถานที่


หากต้องการไปเพิ่มเติมให้อ้างอิงคู่มือGNU Coreutils (การเน้นของฉัน):

หากคุณใช้โลแคลที่ไม่ใช่ POSIX (เช่นโดยการตั้งค่าLC_ALLเป็นen_US) การเรียงลำดับอาจสร้างเอาต์พุตที่เรียงลำดับแตกต่างจากที่คุณคุ้นเคย

ในกรณีที่ตั้งค่าตัวแปรสภาพแวดล้อมในการLC_ALL Cโปรดทราบว่าการตั้งค่าLC_COLLATEมีเพียงสองปัญหา ก่อนอื่นมันจะไม่ได้ผลถ้าLC_ALLตั้งไว้เช่นกัน ประการที่สองมันมีพฤติกรรมที่ไม่ได้กำหนดถ้าLC_CTYPE(หรือLANGถ้าLC_CTYPEไม่ได้ตั้งค่า) ถูกตั้งค่าเป็นค่าที่เข้ากันไม่ได้ ตัวอย่างเช่นคุณจะได้รับพฤติกรรมไม่ได้กำหนดถ้าLC_CTYPEเป็นja_JP.PCKแต่เป็นLC_COLLATEen_US.UTF-8


2
การตั้งค่า LC_ALL = "C" ได้หลอกลวง! ขอบคุณสำหรับการตอบสนองที่รวดเร็ว
clang1234

7
การตั้งค่า LC_ALL = "C" จะเป็นlsภาษาต่างประเทศ (เช่นญี่ปุ่น) ชื่อไฟล์ Unicode เป็น????????
ohho

โปรดทราบว่าด้วยการเพิ่มexport LC_ALL="C"dotfiles ของคุณคุณจะสูญเสียการสนับสนุนสำหรับสถานที่จริงของคุณในทุกสาธารณูปโภคที่ตระหนักถึงสถานที่ ในขณะที่ปัญหาการพิมพ์ที่ @ohho ชี้ให้เห็นอาจแก้ไขได้ด้วยคำตอบของ Faroulคุณจะแนะนำปัญหาการเรียงลำดับ : การเรียงลำดับจะเกิดขึ้นโดยค่าไบต์เท่านั้นทำให้เกิดการเรียงลำดับที่ (a) คำนึงถึงขนาดตัวพิมพ์และ (b) ตัวอักษรเน้นเสียง หลังจากคนที่ไม่เน้นเสียงทั้งหมด
mklement0

35

เพื่อหลีกเลี่ยงการเปลี่ยนแปลงทั่วทั้งระบบโดยไม่จำเป็นต้องใช้จริงเราสามารถเปลี่ยนวิธีการlsทำงานของผู้ใช้ปัจจุบันโดยการเพิ่มนามแฝงไปที่.bashrc:

alias ll='LC_COLLATE=C ls -alF'

เรียงลำดับไฟล์ dot ก่อนอนุญาตให้จัดการ (แสดงและเรียงลำดับ) ชุดอักขระ "ผิดปกติ" อย่างซิริลลิกได้อย่างถูกต้อง ผู้ร้ายเพียงคนเดียวที่การเรียงลำดับจะคำนึงถึงขนาดตัวพิมพ์

ที่มา: http://ubuntuforums.org/showthread.php?t=816753


3
นี่คือคำตอบที่ดีที่สุดที่นี่ไกล
วิศวกร Dollery

สวย. ดีกว่าการเปลี่ยนการตั้งค่าทั้งระบบ (ซึ่งอาจทำให้คุณมีปัญหากับโมดูลหลาม)
Gui Ambros

1
นี่เป็นคำตอบที่มีประโยชน์ที่สุด นอกจากนี้ในสภาพแวดล้อมในกรณีที่LC_ALLมีการตั้งค่าแล้วกับสิ่งที่เข้ากันไม่ได้กับการเรียงลำดับ / hoisting dotfiles ไปด้านบนของlsรายการใช้alias ll='LC_ALL=C ls -alF'แทนเพราะไม่แทนที่LC_COLLATE LC_ALL
matty

8

การตั้งค่า

LC_ALL="C.UTF-8"

ทำงานได้ดีสำหรับฉัน - umlauts และ "ls -la" จะแสดงรายการไฟล์ดอทก่อน


3
ไฟล์ dot แสดงเป็นรายการแรก แต่ตอนนี้ชื่อไฟล์ที่ขึ้นต้นด้วยตัวอักษรตัวพิมพ์ใหญ่จะแสดงรายการก่อนที่จะเริ่มด้วยตัวพิมพ์เล็ก
Chnossos

1
+1 สำหรับการเข้าใกล้กว่าคำตอบที่ยอมรับ แต่เพื่อสรุปข้อ จำกัด : การเรียงลำดับจะกลายเป็นตัวพิมพ์เล็กและตัวอักษรต่างประเทศ - ในขณะที่พิมพ์อย่างถูกต้องเนื่องจากUTF-8- จะไม่ถูกเรียงอย่างถูกต้อง
mklement0

3
C.UTF-8Cเป็นสถานที่ที่ไม่ถูกต้องย้อนกลับสถานที่เกิดเหตุเพื่อให้กลับไป คุณยังคงสูญเสียการสนับสนุน UTF-8 ในความเป็นจริงมันยิ่งแย่ลงเนื่องจากLC_ALL=Cโปรแกรมส่วนใหญ่แสดงอักขระหลายไบต์ได้อย่างถูกต้องที่สุด แต่ในLC_ALL=something_invalidบางโปรแกรมไม่ได้ (เช่น `ls)
Martin Tournoij

@MartinTournoij แต่ถ้าStéphane Chazelas พูดเป็นอย่างอื่นเกี่ยวกับระบบ GNU (โดยทั่วไปแล้ว Debian และ Linux โดยทั่วไป) ซึ่งถูกต้อง?
muru

@muru ฉันไม่แน่ใจฉันเดาว่าคุณจะต้องถามStéphane? สิ่งที่ฉันรู้ก็คือlocaleดูเหมือนว่าจะเกิดข้อผิดพลาดกับLC_ALL=C.UTF-8: gist.github.com/Carpetsmoker/ef09b3734b29372939f97107413d7733 - ที่อยู่บน Arch Linux
Martin Tournoij

3

ls (1) รายการ manpage:

-v เรียงลำดับตามธรรมชาติของหมายเลข (เวอร์ชัน) ภายในข้อความ

นี่ดูเหมือนจะเปลี่ยนวิธีเรียงลำดับรอบระยะเวลาและจัดกลุ่ม dotfiles ก่อน ฉันมี:

alias ls='ls -vAF'
alias ll='ls -l'

ใน ~ / .bashrc ของฉัน


1

ความคิดที่ปิดผนัง

ข้อจำกัดความรับผิดชอบ: นี่จะเกินความเป็นจริงสำหรับคุณส่วนใหญ่ แต่ฉันได้ทำสิ่งนี้มาตั้งแต่ปี 1995 และฉันมีทักษะที่จะทำให้โลกของฉันเป็นไปตามที่ฉันต้องการ ดังนั้นทำไมไม่

ฉันชอบใช้วิธีการเรียงลำดับที่แตกต่างกันlsโดยเฉพาะอย่างยิ่ง-rt(ซึ่งจัดเรียงตามime ที่rแก้ไขแล้วt) ดังนั้นฉันตัดสินใจที่จะลองสิ่งที่บ้าและใช้ awk เพื่อทำการเรียงลำดับของฉัน

# save as ~/.ls.awk
# inpsired by http://superuser.com/questions/448291/how-can-i-make-ls-show-dotfiles-first

{
    if($1 == "total"){
        print $0
        next
    }
    # may need to adjust $9 to match your name column
    if(match($9, /^(\033\[[0-9]*m)*\./)) # optionally look past xterm highlighting like: ^[[34m
        df[++dd] = $0
    else
        nf[++nn] = $0
}
END{
    while (++d in df)
        print df[d]
    while (++n in nf)
        print nf[n]
}

ตอนนี้แทนที่จะกำหนดนามแฝงทุบตีฉันกำหนดฟังก์ชั่นทุบตี (เพราะนามแฝงสามารถต่อท้ายข้อโต้แย้งที่ท้าย แต่ฟังก์ชั่นสามารถใช้งานได้ทุกที่)

ll(){ CLICOLOR_FORCE=1 ls -lhA $* | awk -f ~/.ls.awk; }

เพื่อดูผลลัพธ์

ลองสร้างตัวอย่างไฟล์:

for n in 4 .4 3 .3 2 .2 1 .1; do touch $n; sleep 1; done

ใช้ ls ธรรมดา

$ ls -lA
total 8
-rw-r--r--  1 bbronosky  staff    0 Dec  1 00:25 .1
-rw-r--r--  1 bbronosky  staff    0 Dec  1 00:25 .2
-rw-r--r--  1 bbronosky  staff    0 Dec  1 00:25 .3
-rw-r--r--  1 bbronosky  staff    0 Dec  1 00:25 .4
-rwxr-xr-x  1 bbronosky  staff  285 Nov 29 13:14 .ls.awk
-rwxr-xr-x  1 bbronosky  staff    0 Dec  1 00:25 1
-rwxr-xr-x  1 bbronosky  staff    0 Dec  1 00:25 2
-rwxr-xr-x  1 bbronosky  staff    0 Dec  1 00:25 3
-rwxr-xr-x  1 bbronosky  staff    0 Dec  1 00:25 4
$ ls -lArt

total 8
-rwxr-xr-x  1 bbronosky  staff  285 Nov 29 13:14 .ls.awk
-rwxr-xr-x  1 bbronosky  staff    0 Dec  1 00:25 4
-rw-r--r--  1 bbronosky  staff    0 Dec  1 00:25 .4
-rwxr-xr-x  1 bbronosky  staff    0 Dec  1 00:25 3
-rw-r--r--  1 bbronosky  staff    0 Dec  1 00:25 .3
-rwxr-xr-x  1 bbronosky  staff    0 Dec  1 00:25 2
-rw-r--r--  1 bbronosky  staff    0 Dec  1 00:25 .2
-rwxr-xr-x  1 bbronosky  staff    0 Dec  1 00:25 1
-rw-r--r--  1 bbronosky  staff    0 Dec  1 00:25 .1

ใช้ฟังก์ชั่นของฉันที่กรองด้วย awk

$ ll
total 8
-rw-r--r--  1 bbronosky  staff     0B Dec  1 00:25 .1
-rw-r--r--  1 bbronosky  staff     0B Dec  1 00:25 .2
-rw-r--r--  1 bbronosky  staff     0B Dec  1 00:25 .3
-rw-r--r--  1 bbronosky  staff     0B Dec  1 00:25 .4
-rwxr-xr-x  1 bbronosky  staff   285B Nov 29 13:14 .ls.awk
-rwxr-xr-x  1 bbronosky  staff     0B Dec  1 00:25 1
-rwxr-xr-x  1 bbronosky  staff     0B Dec  1 00:25 2
-rwxr-xr-x  1 bbronosky  staff     0B Dec  1 00:25 3
-rwxr-xr-x  1 bbronosky  staff     0B Dec  1 00:25 4

$ ll -rt
total 8
-rwxr-xr-x  1 bbronosky  staff   285B Nov 29 13:14 .ls.awk
-rw-r--r--  1 bbronosky  staff     0B Dec  1 00:25 .4
-rw-r--r--  1 bbronosky  staff     0B Dec  1 00:25 .3
-rw-r--r--  1 bbronosky  staff     0B Dec  1 00:25 .2
-rw-r--r--  1 bbronosky  staff     0B Dec  1 00:25 .1
-rwxr-xr-x  1 bbronosky  staff     0B Dec  1 00:25 4
-rwxr-xr-x  1 bbronosky  staff     0B Dec  1 00:25 3
-rwxr-xr-x  1 bbronosky  staff     0B Dec  1 00:25 2
-rwxr-xr-x  1 bbronosky  staff     0B Dec  1 00:25 1

คุณสามารถดูการใช้งานของฉันที่นี่https://github.com/RichardBronosky/dotfiles/commit/6170c0a9

สิ่งที่สำคัญที่สุดเกี่ยวกับเรื่องนี้คือมันเป็นกรอบสำหรับการปรับแต่งlsผลลัพธ์ของคุณ คุณสามารถทำอะไรก็ได้ที่คุณต้องการด้วยตัวกรอง awk คุณอาจต้องการให้มันเป็นไดเรกทอรีแล้วดอทไฟล์แล้วทุกอย่างอื่น เมื่อคุณรู้วิธีจัดการกับสี xterm แล้วก็ไม่ยากเกินไป มันขึ้นอยู่กับคุณทั้งหมด


-1

อาจลองในไฟล์. bashrc หรือ / etc / bashrc ของคุณ:

LS_OPTIONS='--color=tty -A -F -X -B -h -v -b -T 0 --group-directories-first';
export LS_OPTIONS;
alias ls='/bin/ls $LS_OPTIONS';

สิ่งนี้ถือว่าคุณกำลังใช้ ls รุ่นที่ค่อนข้างใหม่กว่าซึ่งใช้ "--group-directory-first" เป็นตัวเลือก คุณสามารถปรับแต่งตัวเลือก LS ตามที่คุณต้องการได้อย่างชัดเจน


สิ่งที่--group-directories-firstจะทำอย่างไรกับ“ show dotfiles ก่อน”?
G-Man กล่าวว่า 'Reinstate Monica'
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.