รายชื่อไดเรกทอรีไม่ได้เรียงอย่างเต็มที่


18

ฉันมีรายการไดเรกทอรีต่อไปนี้ในระบบ Debian Linux อย่างไรก็ตามสิ่งหนึ่งที่แปลกก็คือไฟล์ populate.sql ดูเหมือนจะไม่ได้เรียงกับส่วนที่เหลือ

-rw-r--r-- 1 user1 user1 10004 Jul 28 13:16 populate2.sql
-rw-r--r-- 1 user1 user1 10244 Jul 28 13:16 populate3.sql
-rw-r--r-- 1 user1 user1 10359 Jul 28 13:16 populate4.sql
-rw-r--r-- 1 user1 user1 11618 Jul 28 13:16 populate5.sql
-rw-r--r-- 1 user1 user1 11654 Jul 28 13:17 populate6.sql
-rw-r--r-- 1 user1 user1 12198 Jul 30 16:20 populate7.sql
-rw-r--r-- 1 user1 user1 12286 Aug 10 00:10 populate8.sql
-rw-r--r-- 1 user1 user1 12331 Aug 19 08:48 populate9.sql
-rw-r--r-- 1 user1 user1 12401 Aug 20 14:58 populatea.sql
-rw-r--r-- 1 user1 user1 12460 Aug 22 01:09 populateb.sql
-rw-r--r-- 1 user1 user1 12503 Aug 22 17:13 populatec.sql
-rw-r--r-- 1 user1 user1 13341 Aug 23 23:23 populated.sql
-rw-r--r-- 1 user1 user1 13414 Aug 27 23:01 populatee.sql
-rw-r--r-- 1 user1 user1 16064 Aug 31 00:03 populatef.sql
-rw-r--r-- 1 user1 user1 17529 Sep 16 15:38 populateg.sql
-rw-r--r-- 1 user1 user1 19348 Sep 19 22:50 populateh.sql
-rw-r--r-- 1 user1 user1 21033 Sep 27 20:46 populatei.sql
-rw-r--r-- 1 user1 user1 21024 Sep 28 00:02 populatej.sql
-rw-r--r-- 1 user1 user1 22505 Sep 28 22:55 populatek.sql
-rw-r--r-- 1 user1 user1 23831 Oct  5 21:24 populatel.sql
-rw-r--r-- 1 user1 user1 23665 Nov  2 22:16 populatem.sql
-rw-r--r-- 1 user1 user1 23513 Nov  4 21:53 populaten.sql
-rw-r--r-- 1 user1 user1 27191 Nov 19 14:55 populateo.sql
-rw-r--r-- 1 user1 user1 30142 Nov 28 17:51 populatep.sql
-rw-r--r-- 1 user1 user1 30853 Dec 10 14:49 populateq.sql
-rw-r--r-- 1 user1 user1 33690 Dec 11 23:43 populater.sql
-rw-r--r-- 1 user1 user1  9945 Jul 28 13:16 populate.sql
-rw-r--r-- 1 user1 user1 38696 Jan 16 22:27 populates.sql
-rw-r--r-- 1 user1 user1 38696 Jan 16 22:27 populatet.sql

ตอนแรกฉันคิดว่าอาจเป็นเพราะตัวละครที่ซ่อนอยู่หรือบางสิ่งบางอย่าง แต่ฉันไม่สามารถนึกถึงตัวละครที่ซ่อนอยู่ซึ่งจะอยู่ระหว่าง r และ s นอกจากนี้ถ้าฉันพิมพ์vim populate.sqlลงในพรอมต์คำสั่งมันจะเปิดไฟล์ที่ถูกต้องซึ่งเป็นหลักฐานเพิ่มเติมว่าไม่มีตัวอักษรแปลก ๆ อยู่ที่นั่น

ความคิดใด ๆ ที่ทำไมpopulate.sqlการจัดเรียงไม่ถูกต้อง?


1
นี่เป็นระบบ Linux หรือ Mac OS / BSD หรือไม่ ( lsเวอร์ชันแตกต่างกัน) ดูเหมือนว่าจะมีการข้ามช่วงเวลาไปเพื่อวัตถุประสงค์ในการจัดเรียงซึ่งน่าสนใจ
ไวด์การ์ด

@ Wildcard มันอยู่บน Debian Linux
kojow7

คำตอบ:


27

LC_COLLATEด้วยการเปรียบเทียบ Unicode ที่ทราบเช่นen_US.UTF-8ผลลัพธ์ในการเรียงลำดับที่ละเว้นเครื่องหมายวรรคตอน ดังนั้นpopulate.sqlการเรียงลำดับเป็นpopulatesqlหลังจากที่แต่ก่อนpopulatersqlpopulatessql

หากคุณต้องการที่จะเห็นการเปลี่ยนแปลงพฤติกรรมนี้ลองเรียกใช้LC_COLLATE=C ls -alและมันจะถูกจัดเรียงในการเรียงลำดับ C (โดยเฉพาะไบต์โดยไม่คำนึงถึง codepoints หรือสถานที่ใด ๆ )


2
น่าสนใจ Debian รุ่นล่าสุดเป็นเช่นนั้นโดยค่าเริ่มต้นหรือมีการตั้งค่าที่ฉันจะเปลี่ยนเป็นเปิดใช้งานหรือไม่ ฉันจำไม่ได้ว่าเคยเจอปัญหานี้มาก่อนหรือไม่
kojow7

ฉันไม่ทราบว่าจะเป็นเมื่อเร็ว ๆ นี้หรือไม่ แต่ฉันเชื่อว่าสถานที่ตั้งเริ่มต้นมักจะเป็น C เสมอ
David

1
เมื่อไม่มี LC_ * ตัวแปร LANG จะถูกตั้งค่าโลแคลดีฟอลต์คือและเป็น C / POSIX เสมอ แต่ระบบส่วนใหญ่มีการตั้งค่าโลแคลเริ่มต้นและผู้ใช้โดยทั่วไปสามารถระบุได้ในเวลาล็อกอินเช่นกัน พฤติกรรมการเรียงลำดับโลแคล GNU libc ดังที่พบใน Debian นั้นเป็นเช่นนั้นมานานกว่า 10 ปี
Stéphane Chazelas

เพียงเพื่อการอ้างอิงฉันได้ลองติดตั้ง Debian ใหม่และใช่มันไม่สนใจเครื่องหมายวรรคตอนในการเรียงลำดับโดยค่าเริ่มต้น ในมันบอกว่า/etc/default/locale LANG="en_US.UTF-8"
kojow7
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.