ฉันจะสร้างตัวอักขระขีดเส้นใต้ได้อย่างไร?


20

ฉันชอบความสามารถในการตั้งชื่อไฟล์และไดเรกทอรีด้วยคำนำหน้าขีดล่างถ้าเป็นสิ่งที่ฉันต้องการแยกจากไฟล์และไดเรกทอรีอื่น ๆ ในระดับเดียวกัน ตัวอย่างเช่นบน Windows และ Mac คำนำหน้าไฟล์ที่มีเครื่องหมายขีดล่างเรียงลำดับไว้ที่ด้านบนด้านหน้าของไฟล์ที่ขึ้นต้นด้วยตัวอักษรและตัวเลข

googling ของฉันเปิดขึ้นแล้วว่าเกี่ยวข้องกับ LC_COLLATE และสถานที่ปัจจุบันของฉัน (en_US) ไม่เป็นไรแม้ว่าฉันจะไม่เข้าใจว่าทำไม en_US จึงไม่เรียงตามที่คาดไว้

จากสถานที่ตั้งของสถานประกอบการสาธิต ICU Collateไปที่ en_US_POSIX ดูเหมือนจะมีลำดับการจัดเรียงที่ฉันกำลังมองหา (คุณต้องแก้ไขข้อมูลตัวอย่างและเพิ่มขีดล่างเพื่อทดสอบ) แต่ฉันไม่เห็นวิธีใช้สิ่งนี้ในเปลือก Linux ของฉัน

เป็นการดีที่ฉันต้องการที่จะสามารถตั้งค่าบางอย่างในการกำหนดค่า bash ของฉันเพื่อให้ ls เรียงลำดับการขีดเส้นใต้ก่อนเสมอ ฉันจะทำสิ่งนี้อย่างไร


ฉันไม่สามารถทำซ้ำได้โดยใช้ ICU Collate ด้วยค่าเริ่มต้นหรือด้วย en_US_POSIX.txt ผ่าน "เรียกกฎสำหรับสถานที่" คุณสามารถอธิบายการตั้งค่าที่คุณใช้หรือไม่
Mikel

คำถามที่คล้ายกันaskubuntu.com/questions/47702/…
Mikel

@Mikel ใช้ลิงค์ที่ฉันให้ไว้ข้างต้นเพิ่มขีดล่างบางส่วนไปยังข้อมูลการทดสอบแล้วส่งเพื่อดูผลลัพธ์ของการเรียงลำดับ
Tom Auger

นั่นคือสิ่งที่ฉันทำและสตริงที่ขึ้นต้นด้วยเครื่องหมายขีดล่างจะถูกจัดเรียงไว้ตรงกลางแทนที่จะเป็นจุดเริ่มต้นราวกับว่าขีดเส้นใต้ไม่อยู่ที่นั่น
Mikel

1
คำถามที่เกี่ยวข้องกับข้อเสนอว่าในการเปลี่ยนแปลงความหมายจริงเพื่อการเปรียบเทียบเป็นunix.stackexchange.com/questions/421908
JdeBP

คำตอบ:


5

หากคุณไม่lsสามารถเรียงลำดับตามที่คุณต้องการให้ลองใช้การขยายตัวของเชลล์

คุณสามารถใช้รูปแบบชื่อไฟล์เพื่อเรียกใช้lsกับรายการไฟล์ที่เชลล์เรียงลำดับแล้วโดยข้ามวิธีที่lsใช้

ls -lf _* [!_]*

สมมติว่าคุณมีไฟล์

_a a _b b _c c

นี่มันเหมือนการวิ่ง

ls -lf _a _b _c a b c

คำอธิบาย:

_* เป็นรูปแบบเชลล์ที่ตรงกับชื่อไฟล์ใด ๆ ที่ขึ้นต้นด้วยขีดล่างขยายตามลำดับตัวอักษร

[!_]*ตรงกับชื่อไฟล์ใด ๆ ที่ไม่ได้ขึ้นต้นด้วยขีดล่างขยายในลำดับตัวอักษร

-fบอกlsให้ไม่เรียงลำดับเพราะเชลล์ทำไปแล้ว

ข้อมูลเพิ่มเติม: การขยายชื่อไฟล์ bash

หากมีไดเรกทอรีในไดเรกทอรีปัจจุบันคุณจะต้องเรียกใช้คำสั่งเช่นนี้เพื่อหลีกเลี่ยงการแสดงรายการไฟล์ในไดเรกทอรี:

ls -lfd _* [!_]*

7
อย่างไรก็ตาม DOS / Windows / OSX ไม่ได้ใส่เครื่องหมายขีดล่างก่อนสิ่งอื่นใด: พวกมันเรียงตัวพิมพ์เล็กและใหญ่ด้วยการขีดเส้นใต้ที่อยู่หน้าตัวอักษร แต่อักขระเครื่องหมายวรรคตอนอื่น ๆ บางตัวไปข้างหน้า การใช้_เพื่อทำให้ไฟล์ปรากฏเป็นอันดับแรกเป็นการแฮ็คเฉพาะระบบปฏิบัติการ และเวอร์ชันแฮกของการแฮ็คนี้คือการเริ่มต้นชื่อไฟล์ด้วยอักษรตัวใหญ่: การประชุม unix เริ่มต้นคือการใช้อักษรตัวพิมพ์เล็กในชื่อไฟล์เท่านั้น
Gilles 'หยุดความชั่วร้าย'

4
หรือศูนย์ 00READMEเช่น
mattdm

1
@Gilles +1 สำหรับวิธีปฏิบัติที่ดีที่สุดของยูนิกซ์ในการใช้ตัวพิมพ์ใหญ่กับไฟล์สำคัญเพื่อทำให้เป็นอันดับแรก ในตอนท้ายของวันถ้าเป็นแบบแผนมันคงจะดีที่สุดที่ฉันจะยอมรับมันแทนที่จะพยายามบังคับให้ยูนิกซ์ทำตัวเหมือนระบบปฏิบัติการอื่น ๆ ดังนั้นฉันจึงสามารถใช้การประชุมที่พัฒนาขึ้นสำหรับ Mac หรือ Windows ขอบคุณสำหรับเคล็ดลับที่ดี
Tom Auger

1
@TomAuger -fบอกว่าlsอย่าทำการเรียงลำดับของมันเองดังนั้นมันจึงแสดงอาร์กิวเมนต์ของมันตามลำดับที่ส่งผ่าน ผลลัพธ์ของการขยาย wildcard แต่ละเชลล์_*และ[!_]*เป็นรายการที่เรียงลำดับตามพจนานุกรม
Gilles 'SO- หยุดความชั่วร้าย'

1
@TomAuger อาร์กิวเมนต์ที่จะlsถูกจัดเรียง (ในสองกลุ่ม: กลุ่มที่ขึ้นต้นด้วย_และกลุ่มอื่น ๆ ) เมื่อสร้างโดยเชลล์ วิ่งecho ls -lf _* [!_]*เพื่อดูว่าเกิดอะไรขึ้น -fธงบอกlsว่าไม่ต้องทำเรียงลำดับใด ๆ
Gilles 'SO- หยุดความชั่วร้าย'

16

หากคุณไม่ต้องการผสมตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ให้ตั้งค่าโลแคลของคุณเป็นCตัวอักษรซึ่งเรียงตามตัวเลข _อยู่ระหว่างตัวพิมพ์ใหญ่และตัวพิมพ์เล็ก

$ LC_COLLATE=C ls    
BAR  FOO  _score  _under  hello  world
$ LC_COLLATE=en_US ls                    
BAR  FOO  hello  _score  _under  world

การตั้งค่าโลแคลLC_MESSAGES(ภาษาของข้อความแสดงข้อผิดพลาด), LC_CTYPE(ชุดอักขระ) และLC_TIME(รูปแบบวันที่และเวลา) มีประโยชน์มากมาย LC_COLLATEและLC_NUMERICมักจะมีปัญหามากกว่าที่ควรค่าฉันไม่แนะนำให้ตั้งค่า การเรียงลำดับพจนานุกรมที่เหมาะสมมีความซับซ้อนมากกว่าที่LC_COLLATEควรจะระบุและมันอาจทำให้เกิดพฤติกรรมแปลก ๆ ทุกประเภทเมื่อคุณใช้ช่วงอักขระในการแสดงออกปกติ ส่วนใหญ่จะเป็นเครื่องสำอางยกเว้นเมื่อมีอะไรผิดพลาดอย่างน่ากลัวเพราะบางโปรแกรมที่ผลิตจำนวนที่มีตัวคั่นทศนิยมอื่นที่ไม่ใช่LC_NUMERIC.


+1 น่าสนใจมาก ดังนั้นเมื่อใช้แบบฟอร์มนี้คุณจะตั้งค่าตัวแปรสภาพแวดล้อม LC_COLLATE เป็นการชั่วคราวสำหรับอินสแตนซ์หนึ่งของ ls หรือไม่ นั่นถูกต้องใช่ไหม?
Tom Auger

1
วิธีใดที่จะทำให้ขีดล่างปรากฏขึ้นก่อนตัวอักษรตัวพิมพ์ใหญ่?
Tom Auger

1
@TomAuger ใช่VAR=value cmdชุดVARไปvalueเฉพาะในสภาพแวดล้อมของcmdและไม่ได้สัมผัสค่า (หรือไม่มีค่า) ในเปลือกที่คุณใช้มัน หากต้องการให้ขีดล่างปรากฏขึ้นก่อนตัวพิมพ์ใหญ่คุณจะต้องกำหนดการตั้งค่าภาษาของคุณเอง สิ่งนี้เป็นไปได้ แต่น่าใช้น้อยเพราะภายใต้ Linux อย่างน้อยไลบรารีมาตรฐานจะค้นหาเฉพาะคำจำกัดความของตำแหน่งที่ตั้งใน/usr/lib/locale- ไม่มี~/.localeตัวแปรสภาพแวดล้อมหรือที่คุณสามารถen_tomตั้งค่าของคุณ
Gilles 'SO- หยุดความชั่วร้าย'

@TomAuger ถ้านี้เป็นเพียงเกี่ยวกับlsคำสั่งไปกับข้อเสนอแนะของมิเกล
Gilles 'SO- หยุดความชั่วร้าย'

2

น่าเสียดายที่ Linux ใช้ glibc สำหรับข้อมูลโลแคลไม่ใช่ ICU ดังนั้นจึงไม่มีทางที่จะนำสิ่งนี้ไปใช้กับ Linux โดยตรงโดยไม่ต้องใช้ความพยายามอย่างมากในการติดตั้ง ICU ลงใน glibc หรือเสริมข้อมูล locale ใน glibc


-4

การเพิ่ม-fสวิตช์ (ไม่มีการจัดเรียง) ทำให้มันแสดงวิธีนั้นสำหรับฉัน

man ls

[root@dusknoir ~/java/test]# ls -fl
total 0
-rw-r--r--  1 root  wheel  0 Jun  1 13:27 _1
-rw-r--r--  1 root  wheel  0 Jun  1 13:27 _2
-rw-r--r--  1 root  wheel  0 Jun  1 13:27 _3
-rw-r--r--  1 root  wheel  0 Jun  1 13:27 1
-rw-r--r--  1 root  wheel  0 Jun  1 13:27 2
-rw-r--r--  1 root  wheel  0 Jun  1 13:27 3

6
เพียงเพราะนั่นคือวิธีที่พวกเขาเก็บไว้ในระบบไฟล์
Ignacio Vazquez-Abrams

3
ขออภัยคำตอบนี้ผิดธรรมดา ทดสอบ: touch 3 1 _1 _3 2 _2 && ls -flผลลัพธ์2 . 1 3 _2 _3 .. _1
Marco
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.