Phân loại ls không phân biệt chữ hoa chữ thường trong Mac OSX


30

Làm cách nào tôi có thể thực hiện lslệnh trong Max OS X Lion sắp xếp các tệp và thư mục tương tự như cách Ubuntu Linux thực hiện (không phân biệt chữ hoa chữ thường, thư mục KHÔNG ở trên, chấm tệp KHÔNG ở trên)? Lý tưởng nhất là tôi muốn làm điều này mà không cần đầu ra đường ống đến một lệnh khác, chẳng hạn như sort.

Ví dụ, tôi muốn xem:

foo
Foobar
MyStuff/
.stuff/
test.txt

thay vì:

.stuff
Foobar
MyStuff/
foo
test.txt

Trong Linux, lsthứ tự sắp xếp được kiểm soát bởi ngôn ngữ của hệ thống, cụ thể LC_COLLATE. Khi nào LC_COLLATE=en_US.UTF-8, ls sẽ sắp xếp các mục như tôi muốn. Khi nào LC_COLLATE=C, lssẽ sắp xếp tương tự như OS X.

LC_COLLATEđược đặt thành en_US.UTF-8trong OS X, nhưng lsvẫn sắp xếp POSIXtheo cách cũ . Có ai biết làm thế nào tôi có thể làm cho điều này hoạt động giống như Linux không?


Nếu nó giúp: apple.stackexchange.com/a/22304/8546 quan sát rằng HFS Plus thường được cấu hình để không phân biệt chữ hoa chữ thường nhưng bảo quản trường hợp .
Graham Perrin

Câu trả lời:


16

Nó có thể không thể:

Xem xét mã nguồn cho ls , nó sử dụng strcoll để sắp xếp tên tệp và do đó nên tôn trọng LC_COLLATE.

Một số bài đăng trực tuyến cho thấy rằng các địa điểm trong BSD (và Darwin / OS X) có phần bị hỏng so với các địa điểm trong Linux. Tôi đã viết một chương trình sắp xếp nhanh của riêng mình, trong đó đặt rõ ràng vị trí của nó và đã kiểm tra nó bằng cả hai en_US.UTF-8 và C trên máy của tôi (Mac OS 10.6.3) và máy đại học (Linux, FC11?). Trong khi sắp xếp hoạt động như mong đợi trên máy linux, ("a B c" so với "B a c"), mac luôn sắp xếp chúng là "B a c".

Nguồn: http://ask.metafilter.com/130292/CaseInsensitive-LS-on-Mac-OS-X

CÂU TRẢ LỜI

Lệnh này không sắp xếp các tệp chấm, nhưng hiển thị danh sách thư mục bổ sung

ls -f1 

Tôi đã gần với điều này:

.
..
.stuff
foo
Foobar
MyStuff
test.txt

1
Điều thú vị là "vô hiệu hóa sắp xếp" với tùy chọn -f thực sự có vẻ sắp xếp nó như mong đợi. Tôi giả sử đây là các mục sắp xếp hệ thống tập tin / HFS + với đối chiếu "tự nhiên" hơn.
Gerry

6

Tôi biết điều này đã được trả lời nhưng công việc này tốt nhất cho tôi:

ls -f1 -alF -G

Nó liệt kê tất cả các chi tiết và sắp xếp chúng bằng cách bỏ qua trường hợp.


4

Điều này đã làm tôi khó chịu trong một lúc và cuối cùng tôi đã sắp xếp nó (heh). Sau khi thử một loạt các đề xuất không hiệu quả, đây là những gì đã làm.

Nếu bạn sẵn sàng cài đặt MacPorts (hoặc Homebrew hoặc Fink), phiên bản GNU của ls thực hiện chính xác những gì bạn muốn. Bản thân tôi sử dụng MacPorts, vì vậy đó là cách tiếp cận tôi sẽ giải thích:

  1. Tải xuống và cài đặt MacPorts:

    http://www.macports.org

  2. Cài đặt gói GNU Coreutils:

    sudo port install coreutils

  3. Bây giờ bạn sẽ có GNU ls : gls. Hãy thử nó trong một thư mục chứa các mục bắt đầu bằng cả chữ hoa và chữ thường:

    gls -U

    ( -UTùy chọn này thực sự có nghĩa là "chưa được sắp xếp", nhưng trên OS X có tác dụng mong muốn làm cho nó không nhạy cảm.)

  4. Thêm bí danh này vào của bạn .bash_profileđể thông thường lssẽ hoạt động theo cách bạn muốn (Tôi thích đầu ra màu, nhưng bạn có thể bỏ qua nếu bạn muốn; bạn chỉ cần -U):

    alias ls='gls -U --color'

Lưu ý rằng -Utùy chọn có thể sẽ không hoạt động trên các nền tảng khác. Trong OS X, dường như luôn luôn làm đúng (có thể vì HFS + không phân biệt chữ hoa chữ thường - "nhận biết trường hợp", về mặt kỹ thuật), nhưng nếu bạn thử nó trên hộp Linux, kết quả rất có thể sẽ không xảy ra sắp xếp tất cả


1
3. dường như không còn hiệu ứng phụ mong muốn nữa (tùy chọn -U) trong macOS> = 10.13 do APFS mới.
Marius Hofert

1
Có vẻ như không có cách nào để làm điều này với APFS.
Jason Sims

Xác nhận không hoạt động vào ngày 10.12. Cảm ơn!
Đại tá Panic

4

Thêm vào những gì Mike viết ở trên, tôi đã đưa nó đi xa hơn một chút và tìm ra cách xác định quy tắc đối chiếu của riêng bạn.

Các định nghĩa miền địa phương được đặt trong / usr / share / locale /. Mỗi thư mục là một miền địa phương và có một tệp (hoặc một liên kết) LC_COLLATE, xác định các ký hiệu nào là "giống nhau" (ví dụ: U, u và ü nên được coi là giống nhau khi đặt hàng). Bạn có thể sao chép một thư mục và điều này sẽ tạo ra một định nghĩa miền địa phương mới:

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

Bây giờ bạn sẽ có một miền địa phương mới gọi là 'en_GB.UTF-8-CI' ('CI' cho trường hợp không phân biệt chữ hoa chữ thường) và bạn có thể sử dụng LC_COLLATE từ đó.

Bây giờ, để thay đổi LC_COLLATE ở miền địa phương mới, bạn có thể tải xuống các nguồn ngôn ngữ từ http://www.opensource.apple.com/source/adv_cmds/adv_cmds-119/usr-share-locale.tproj/colldef/ , chỉnh sửa nguồn gần nhất với những gì bạn muốn và chạy

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

và bây giờ khi bạn chạy

$ LC_COLLATE=en_GB.UTF-8-CI ls

bạn sẽ có sự sắp xếp theo quy tắc của bạn .

Vâng, đây là những gì nó cần để làm cho trường hợp không nhạy cảm sắp xếp 'ls'.


2

Như một cách giải quyết, bạn có thể sử dụng hàm và bí danh:

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

Điều này tạo ra một trường hợp đầu ra được sắp xếp không nhạy cho lệnh ls tiêu chuẩn.


1
Tôi phải lưu ý: điều này sẽ thất bại nếu ví dụ -l được sử dụng. Sau đó, ls tạo ra một dòng "tổng X" khác ở đầu, cũng sẽ được sắp xếp.
Arne

2

Sử dụng

ls -f

làm việc cho tôi

-f chính thức tắt bất kỳ sắp xếp nào, nhưng có vẻ như sau đó loại HFS ban đầu tỏa sáng, đó chính xác là một loại không phân biệt chữ hoa chữ thường.

Tôi đoán, điều này thực sự phụ thuộc vào việc bạn có phân biệt chữ hoa chữ thường hay không, nhưng vì định dạng HFS không phân biệt chữ hoa chữ thường là mặc định cho các đĩa hệ thống Mac OS X, nên nó sẽ hoạt động với phần lớn người dùng.


Đây chắc chắn là câu trả lời đúng. Vấn đề duy nhất với nó là nó cũng tự động bật -a và không có cách nào để tắt nó, điều này sẽ hiển thị cho bạn các tệp / thư mục bắt đầu bằng một khoảng thời gian, bao gồm cả. và ...
lensovet

1
Vấn đề khác (bây giờ) là điều này dường như không còn hoạt động nữa trong macOS> = 10.13 do APFS mới.
Marius Hofert

1

Lấy cảm hứng từ câu trả lời của Mike, tôi đã thêm phần sau vào / etc / bashrc và nó hoạt động rất đẹp trong Mojave. Nó liệt kê các tập tin ẩn ở cuối khi -a được thêm vào, nhưng điều đó không làm phiền tôi.

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

Bạn có thể thấy cấu hình mới bằng cách chạy lệnh miền địa phương. Để hoàn nguyên, chỉ cần xóa dòng khỏi / etc / bashrc và đăng nhập lại vào terminal.

$ 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=

Lưu ý rằng cả ls -f1 và ls -f đều không hoạt động với tôi trong Mojave. Tôi đã kết thúc với một danh sách thực sự chưa được sắp xếp. Chỉ có giải pháp tôi đã cung cấp làm việc cho tôi ở Mojave.


Câu trả lời tốt nhất, nhưng ví dụ đưa ra làm quá nhiều. Nó nên được cắt bớt để: đặt dòng sau vào .bashrchoặc .zshrc:alias ls="LC_COLLATE=cs_CZ.ISO8859-2 ls"
user1561361

0

Chạy:

$ type ls

Bạn có thể sẽ thấy rằng lslệnh của bạn là bí danh.


Trên linux : ls is /bin/ls. Trên OS X : ls is hashed (/bin/ls). Dù bằng cách nào, ngay cả khi tôi gọi /bin/lstrực tiếp, nó vẫn không sắp xếp theo LC_COLLATE.

2
Điều đó thật đáng ngạc nhiên, tôi đã đặt cược rằng lslệnh của bạn được đặt bí danh để bao gồm --group-directories-first. Nó có thể vẫn được thực hiện ở một nơi khác, không phải là bí danh.
MikeyB

0

Nếu bạn chủ yếu quan tâm đến thứ tự sắp xếp của các tệp chấm, bạn có thể sắp xếp theo phần mở rộng : Sử dụng lslệnh từ GNU Fileutils với tùy chọn --sort=extension. (Bạn có thể cài đặt GNU Fileutils, ví dụ như thông qua macports.)


0

ls đang sắp xếp theo LC_COLLATE, chỉ là hầu hết tất cả các tệp LC_COLLATE được đặt để thực hiện sắp xếp phân biệt chữ hoa chữ thường. http://collation-charts.org/fbsd54/

Có hai cái được đặt cho phân loại không phân biệt chữ hoa chữ thường: cs_CZ.ISO8859-2 và et_EE.ISO8859-15 et_EE.ISO8859.15 không sắp xếp "Z" theo cách người nói tiếng Anh muốn. cs.CZ.ISO8859-15 làm tốt công việc với bảng chữ cái, tôi chỉ ước nó sẽ sắp xếp "~" trước các ký tự chữ cái.

Giải pháp của tôi là: LC_COLLATE = cs_CZ.ISO8859-2 / bin / ls -FG

Tôi tự hỏi nếu một tệp LC_COLLATE tùy chỉnh có thể được tạo để xử lý "." cách bạn muốn và "~" theo cách tôi muốn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.