Khi sắp xếp tên tệp, ls
bỏ qua các ký tự như -,_
. Tôi dự kiến nó cũng sẽ sử dụng những ký tự đó.
Một ví dụ:
touch a1 a2 a-1 a-2 a_1 a_2 a.1 a.2 a,1 a,2
Bây giờ hiển thị các tệp này với ls -1
:
a1
a_1
a-1
a,1
a.1
a2
a_2
a-2
a,2
a.2
Những gì tôi mong đợi là một cái gì đó như thế này:
a1
a2
a,1
a,2
a.1
a.2
a_1
a_2
a-1
a-2
tức là tôi dự kiến các ký tự không chữ và số sẽ được tính đến khi sắp xếp.
Bất cứ ai có thể giải thích hành vi này? Là hành vi này được ủy quyền bởi một tiêu chuẩn? Hay điều này là do mã hóa là UTF-8?
Cập nhật: Có vẻ như điều này có liên quan đến sắp xếp UTF-8:
$ LC_COLLATE=C ls -1
a,1
a,2
a-1
a-2
a.1
a.2
a1
a2
a_1
a_2
[_-,.]
đang được nhóm lại và bằng cách nào đó bị bỏ qua. Tôi không biết chính xác làm thế nào hoặc ở đâu đối chiếu như vậy được xác định, nhưng nó phải là một vấn đề đối chiếu, bởi vì đơn giản, và chỉ, thay đổi đối chiếu thành C (thông qua LC_COLLATE=C ls -l
) là đủ để cung cấp cho bạn thứ tự sắp xếp mà bạn mong đợi (giả sử LC_ALL
là không ghi đè LC_COLLATE
). Điều này đúng với toàn bộ phạm vi các ký tự trong Mặt phẳng đa ngôn ngữ cơ bản Unicode ... Tôi đã chỉnh sửa câu trả lời của mình để bao gồm một tập lệnh mẫu có nội dung này ...
LC_COLLATE=C ls
?