การเรียงลำดับแบบไม่คำนึงถึงขนาดตัวพิมพ์ใน Mac OSX


30

ฉันจะทำให้lsคำสั่งในไฟล์และไดเรกทอรีเรียงลำดับของ Max OS X Lion คล้ายกับวิธีการที่ Ubuntu Linux ทำอย่างไร โดยหลักการแล้วฉันต้องการทำสิ่งนี้โดยไม่ต้องไพพ์เอาต์พุตไปยังคำสั่งอื่นเช่น sort

ตัวอย่างเช่นฉันต้องการดู:

foo
Foobar
MyStuff/
.stuff/
test.txt

แทน:

.stuff
Foobar
MyStuff/
foo
test.txt

ในลินุกซ์, การเรียงลำดับการสั่งซื้อจะถูกควบคุมโดยสถานที่เกิดเหตุของระบบโดยเฉพาะls LC_COLLATEเมื่อLC_COLLATE=en_US.UTF-8ใด ls จะเรียงลำดับรายการตามที่ฉันต้องการ เมื่อLC_COLLATE=Cใดlsจะจัดเรียงคล้ายกับ OS X

LC_COLLATEมีการตั้งค่าen_US.UTF-8ใน OS X แต่lsยังเรียงลำดับเก่าPOSIXวิธี ไม่มีใครรู้ว่าฉันสามารถทำให้มันทำงานได้เหมือนลีนุกซ์บ้าง


ถ้ามันจะช่วยให้: apple.stackexchange.com/a/22304/8546สังเกตว่า HFS พลัสมักจะกำหนดค่าให้เป็นกรณีตายแต่กรณีการรักษา
เกรแฮมเพอร์ริน

คำตอบ:


16

อาจเป็นไปไม่ได้:

ลองดูที่ซอร์สโค้ดสำหรับ lsมันใช้ strcoll เพื่อเรียงชื่อไฟล์และดังนั้นควรเคารพ LC_COLLATE

การโพสต์ออนไลน์บางรายการแนะนำว่าโลแคลใน BSD (และดาร์วิน / OS X) แตกหักบ้างเมื่อเทียบกับในลินุกซ์ ฉันเขียนโปรแกรมการเรียงลำดับอย่างรวดเร็วของตัวเองซึ่งตั้งค่าตำแหน่งที่ตั้งอย่างชัดเจนและทดสอบโดยใช้ทั้งตำแหน่งที่ตั้ง en_US.UTF-8 และ C บนเครื่องของฉัน (Mac OS 10.6.3) และเครื่องมหาวิทยาลัย (Linux, FC11?) ในขณะที่การเรียงลำดับใช้งานได้ตามที่คาดหวังบนเครื่อง linux ("a B c" กับ "B a c") mac มักจะเรียงลำดับพวกเขาเป็น "B a c"

ที่มา: http://ask.metafilter.com/130292/CaseInsensitive-LS-on-Mac-OS-X

คำตอบเดิม

คำสั่งนี้ไม่ได้เรียงลำดับไฟล์จุด แต่จะแสดงรายการไดเรกทอรีเพิ่มเติม

ls -f1 

ฉันเข้าใกล้สิ่งนี้:

.
..
.stuff
foo
Foobar
MyStuff
test.txt

1
น่าสนใจว่า "ปิดการจัดเรียง" ด้วยตัวเลือก -f จริง ๆ แล้วดูเหมือนว่าจะเรียงลำดับตามที่คาดไว้ ฉันคิดว่านี่เป็นรายการเรียงลำดับระบบไฟล์ / HFS + ที่มีการเรียง "ที่เป็นธรรมชาติ" มากกว่า
เจอร์รี่

6

ฉันรู้ว่าสิ่งนี้ได้รับคำตอบแล้ว แต่สิ่งนี้ดีที่สุดสำหรับฉัน:

ls -f1 -alF -G

มันจะแสดงรายละเอียดทั้งหมดและเรียงลำดับพวกเขาโดยไม่สนใจกรณี


4

สิ่งนี้ได้ดักฟังฉันมาชั่วขณะและในที่สุดฉันก็แยกมันออกมา (heh) หลังจากลองใช้คำแนะนำที่ไม่ได้ผลแล้วนี่คือสิ่งที่ทำ

หากคุณยินดีที่จะติดตั้ง MacPorts (หรือ Homebrew หรือ Fink) รุ่น ls ของ GNU จะทำสิ่งที่คุณต้องการอย่างแท้จริง ฉันใช้ MacPorts ด้วยตัวเองดังนั้นนี่คือวิธีที่ฉันจะอธิบาย:

  1. ดาวน์โหลดและติดตั้ง MacPorts:

    http://www.macports.org

  2. ติดตั้งแพ็คเกจ GNU Coreutils:

    sudo port install coreutils

  3. ตอนนี้คุณควรจะมีคำสั่ง ls glsGNU: ลองในไดเรกทอรีที่มีรายการที่เริ่มต้นด้วยตัวอักษรตัวพิมพ์ใหญ่และตัวพิมพ์เล็ก:

    gls -U

    ( -Uตัวเลือกจริง ๆ แล้วหมายถึง "ไม่ได้เรียงลำดับ" แต่สำหรับ OS X ที่มีผลตามที่ต้องการทำให้ตัวพิมพ์เล็กและใหญ่)

  4. เพิ่มชื่อแทนนี้ในของคุณ.bash_profileดังนั้นปกติlsจะทำงานในแบบที่คุณต้องการ (ฉันชอบเอาท์พุทสี แต่คุณสามารถละเว้นว่าถ้าคุณต้องการ; คุณต้องการเท่านั้น-U):

    alias ls='gls -U --color'

โปรดทราบว่า-Uตัวเลือกอาจไม่ทำงานบนแพลตฟอร์มอื่น ใน OS X ดูเหมือนว่าจะทำในสิ่งที่ถูกต้องเสมอ (อาจเป็นเพราะ HFS + เป็นตัวพิมพ์เล็ก - ตัวพิมพ์เล็ก - "case-aware", ทางเทคนิค) แต่ถ้าคุณลองมันบนกล่อง Linux ผลลัพธ์จะไม่น่าจะเป็นไปได้ เรียงลำดับเลย


1
3. ดูเหมือนจะไม่มีผลข้างเคียงที่ต้องการอีกต่อไป (ตัวเลือก -U) ภายใต้ macOS> = 10.13 เนื่องจาก APFS ใหม่
Marius Hofert

1
ใช่…ดูเหมือนจะไม่มีทางที่จะทำเช่นนี้กับ APFS
Jason Sims

ยืนยันทำงานบน 10.12 แม้ว่า ขอบคุณ!
พันเอก Panic

4

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

นิยามโลแคลอยู่ใน / usr / share / locale / แต่ละโฟลเดอร์เป็นโลแคลและมีไฟล์ (หรือลิงก์) LC_COLLATE ซึ่งกำหนดว่าสัญลักษณ์ใดเป็น "เหมือนกัน" (ตัวอย่างเช่น U, u และüนั้นควรได้รับการพิจารณาเหมือนกันเมื่อทำการสั่งซื้อ) คุณสามารถทำซ้ำไดเรกทอรีและสิ่งนี้จะสร้างคำนิยามสถานที่ใหม่:

$ sudo cp -R en_GB.UTF-8/ en_GB.UTF-8-CI/

ตอนนี้คุณจะมีโลแคลใหม่ที่เรียกว่า 'en_GB.UTF-8-CI' ('CI' สำหรับตัวพิมพ์เล็กและตัวพิมพ์ใหญ่) และคุณสามารถใช้ LC_COLLATE ได้

ตอนนี้หากต้องการเปลี่ยน LC_COLLATE ในสถานที่ใหม่คุณสามารถดาวน์โหลดแหล่งที่มาของสถานที่ได้จาก http://www.opensource.apple.com/source/adv_cmds/adv_cmds-119/usr-share-locale.tproj/colldef/แก้ไขหนึ่ง ที่ใกล้เคียงที่สุดกับสิ่งที่คุณต้องการและเรียกใช้

$ colldef < <new collation file>
$ sudo cp LC_COLLATE /usr/share/locale/en_GB.UTF-8-CI/

และตอนนี้เมื่อคุณเรียกใช้

$ LC_COLLATE=en_GB.UTF-8-CI ls

คุณจะมีการเรียงลำดับตามกฎของคุณ

ใช่นี่คือสิ่งที่ทำให้การเรียงลำดับตัวพิมพ์เล็กและใหญ่


2

คุณสามารถใช้ฟังก์ชั่นและนามแฝงได้:

function lssorted() { /bin/ls "$@" | sort -f ;}
alias ls='lssorted'

สิ่งนี้จะสร้างเคสที่เรียงลำดับเอาต์พุตอย่างไม่ถูกต้องสำหรับคำสั่ง ls มาตรฐาน


1
ฉันต้องทราบ: สิ่งนี้จะล้มเหลวหากมีการใช้ตัวอย่าง -l จากนั้น ls จะสร้างบรรทัดอื่น "total X" ที่จุดเริ่มต้นซึ่งจะถูกจัดเรียงด้วย
Arne

2

การใช้

ls -f

ทำงานได้สำหรับฉัน

-f ปิดการเรียงลำดับอย่างเป็นทางการ แต่ดูเหมือนว่าการเรียงลำดับ HFS ​​ดั้งเดิมจะส่องผ่านซึ่งเป็นประเภทที่ไม่ตรงตามตัวพิมพ์ใหญ่ - เล็ก

ฉันเดาว่าจริง ๆ แล้วขึ้นอยู่กับว่าคุณมีรูปแบบตัวพิมพ์เล็กและใหญ่หรือไม่ แต่รูปแบบ HFS ​​แบบ case-INsensitive เป็นค่าเริ่มต้นสำหรับดิสก์ระบบ Mac OS X สิ่งนี้น่าจะเหมาะกับผู้ใช้ส่วนใหญ่


นี่คือคำตอบที่ถูกต้องอย่างแน่นอน ปัญหาเดียวของมันก็คือมันเปิดโดยปริยายเช่นกันและไม่มีวิธีใดที่จะปิดซึ่งจะแสดงไฟล์ / โฟลเดอร์ที่เริ่มต้นด้วยจุดรวมถึง และ ..
lensovet

1
ปัญหาอื่น ๆ (ตอนนี้) คือสิ่งนี้ดูเหมือนจะไม่ทำงานอีกต่อไปภายใต้ macOS> = 10.13 เนื่องจาก APFS ใหม่
Marius Hofert

1

โดยได้แรงบันดาลใจจากคำตอบของไมค์ฉันได้เพิ่มสิ่งต่อไปนี้ลงใน / etc / bashrc และมันทำงานได้อย่างสวยงามในโมฮาวี มันจะแสดงรายการไฟล์ที่ซ่อนอยู่ในตอนท้ายเมื่อมีการเพิ่ม -a แต่นั่นก็ไม่ได้รบกวนฉัน

export LC_COLLATE="cs_CZ.ISO8859-2"; alias ls='ls -lhFG'

คุณสามารถดูการกำหนดค่าใหม่ได้โดยการรันคำสั่ง locale หากต้องการเปลี่ยนกลับเพียงแค่ลบบรรทัดออกจาก / etc / bashrc แล้วกลับเข้าสู่เทอร์มินัล

$ locale
LANG="en_US.UTF-8"
LC_COLLATE="cs_CZ.ISO8859-2"
LC_CTYPE="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_ALL=

โปรดทราบว่า ls -f1 และ ls -f ไม่เหมาะสำหรับฉันในโมฮาวี ฉันจบด้วยรายการที่ยังไม่เรียงลำดับอย่างแท้จริง วิธีแก้ปัญหาที่ฉันมอบให้ฉันทำงานได้ในโมฮาวีเท่านั้น


คำตอบที่ดีที่สุด แต่ตัวอย่างที่ให้ไว้ทำมากเกินไป ควรตัดให้เหลือ: ใส่บรรทัดต่อไปนี้ใน.bashrcหรือของคุณ.zshrc:alias ls="LC_COLLATE=cs_CZ.ISO8859-2 ls"
user1561489

0

วิ่ง:

$ type ls

คุณอาจพบว่าlsคำสั่งของคุณเป็นนามแฝง


ls is /bin/lsบนลินุกซ์: บน OS ls is hashed (/bin/ls)X: ไม่ว่าจะด้วยวิธีใดแม้ว่าฉันจะโทร/bin/lsโดยตรง แต่ก็ยังไม่เรียงตาม LC_COLLATE

2
เป็นเรื่องที่น่าแปลกใจที่ฉันจะพนันได้ว่าlsคำสั่งของคุณเป็นนามแฝงที่จะรวม--group-directories-firstไว้ มันอาจจะยังคงทำที่อื่นไม่ใช่แค่นามแฝง
MikeyB

0

หากคุณมีความกังวลส่วนใหญ่กับการเรียงลำดับของไฟล์ที่จุดคุณสามารถจัดเรียงโดยขยาย : ใช้lsคำสั่งจากGNU Fileutils--sort=extensionมีตัวเลือก (คุณสามารถติดตั้ง GNU Fileutils เช่นผ่าน macports)


0

ls กำลังเรียงลำดับตาม LC_COLLATE เป็นเพียงแค่ว่าไฟล์ LC_COLLATE ส่วนใหญ่ทั้งหมดจะถูกตั้งค่าให้ทำการเรียงลำดับแบบตรงตามตัวพิมพ์ใหญ่ - เล็ก http://collation-charts.org/fbsd54/

มีสองแบบที่ถูกตั้งค่าสำหรับการเรียงลำดับแบบไม่คำนึงถึงขนาดตัวพิมพ์: cs_CZ.ISO8859-2 และ et_EE.ISO8859-15 et_EE.ISO8859.15 ไม่เรียงลำดับ "Z" ตามที่ผู้พูดภาษาอังกฤษต้องการ cs.CZ.ISO8859-15 ทำงานได้ดีกับตัวอักษรฉันแค่หวังว่ามันจะเรียงลำดับ "~" ก่อนตัวอักษร

โซลูชันของฉันคือ: LC_COLLATE = cs_CZ.ISO8859-2 / bin / ls -FG

ฉันสงสัยว่าไฟล์ LC_COLLATE ที่กำหนดเองสามารถจัดการได้หรือไม่ "." ในแบบที่คุณต้องการและ "~" ในแบบที่ฉันต้องการ

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