Làm thế nào tôi có thể tạo ra các phần mềm hiển thị dotfiles trước tiên?


46

Ở đâu đó trên đường tôi đã vặn lệnh ls của mình và bây giờ tôi nhận được lệnh này khi chạy

$ ls -AhHl --color=auto
-rwxr-xr-x 1 clang clang  640 Mar  1 02:46 apple-touch-icon-precomposed.png
-rwxr-xr-x 1 clang clang  784 Jul 12 02:54 crossdomain.xml
-rwxr-xr-x 1 clang clang 1.2K Mar  1 02:46 favicon.ico
drwxr-xr-x 8 clang clang 4.0K Jul 12 23:50 .git
-rw-r--r-- 1 clang clang   17 Feb 29 19:48 .gitignore
-rwxr-xr-x 1 clang clang 1.4K Jul 12 02:54 humans.txt

Tôi đã làm gì khiến ls bỏ qua các dotfiles và thay vào đó là thứ tự bằng chữ cái đầu tiên?

Đầu ra của locale:

$ locale
LANG=
LANGUAGE=
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=en_US.UTF-8

Câu trả lời:


47

Hãy thử thêm

export LC_COLLATE="C"

trong dotfiles của bạn hoặc thay đổi LC_ALLgán thành:

export LC_ALL="C"

Điều này kiểm soát cách sắp xếp theo cấp độ ký tự hoạt động - trong khi mặc định sẽ là sắp xếp nội tuyến dotfiles, điều này sẽ tạo sortdanh sách dotfiles trước.

Tuy nhiên, lưu ý rằng điều này về cơ bản sẽ ngừng hỗ trợ cho ngôn ngữ thực tế của bạn trên tất cả các tiện ích nhận biết địa phương.


Để đi xa hơn, trích dẫn hướng dẫn sử dụng GNU Coreutils (nhấn mạnh của tôi):

Nếu bạn sử dụng ngôn ngữ không phải POSIX (ví dụ: bằng cách đặt LC_ALLthành en_US), thì sắp xếp có thể tạo ra đầu ra được sắp xếp khác với bạn đã quen.

Trong trường hợp đó, đặt LC_ALLbiến môi trường thành C. Lưu ý rằng cài đặt chỉ LC_COLLATEcó hai vấn đề. Đầu tiên, nó là không hiệu quả nếu LC_ALLcũng được thiết lập. Thứ hai, nó có hành vi không xác định nếu LC_CTYPE(hoặc LANG, nếu LC_CTYPEkhông được đặt) được đặt thành giá trị không tương thích. Ví dụ, bạn nhận được hành vi không xác định nếu LC_CTYPEja_JP.PCKnhưng LC_COLLATEen_US.UTF-8.


2
Đặt LC_ALL = "C" đã thực hiện thủ thuật! Cảm ơn đã phản hồi nhanh chóng
clang1234

7
Đặt LC_ALL = "C" sẽ sử dụng lstên tệp ngoại ngữ (ví dụ tiếng Nhật) là????????
ohho

Lưu ý rằng bằng cách thêm export LC_ALL="C"vào các dotfiles của bạn, bạn sẽ mất hỗ trợ cho địa điểm thực tế của mình trên tất cả các tiện ích nhận biết địa phương. Mặc dù vấn đề in mà @ohho chỉ ra có thể được khắc phục bằng câu trả lời của Faroul , nhưng bạn sẽ đưa ra các vấn đề sắp xếp : việc sắp xếp sẽ chỉ xảy ra theo giá trị byte, dẫn đến việc sắp xếp (a) không phân biệt chữ hoa chữ thường và (b) dấu trọng âm. sau khi tất cả những người không có dấu.
mkuity0

35

Để tránh mọi thay đổi trên toàn hệ thống mà không có nhu cầu thực sự, người ta chỉ có thể thay đổi cách thức lshoạt động của người dùng hiện tại bằng cách thêm bí danh vào .bashrc:

alias ll='LC_COLLATE=C ls -alF'

Điều này sắp xếp các tập tin dấu chấm đầu tiên, cho phép xử lý đúng cách (hiển thị và sắp xếp) các bộ ký tự "không phổ biến" như cyrillic. Thủ phạm duy nhất là việc phân loại sẽ phân biệt chữ hoa chữ thường.

Nguồn: http://ubuntuforums.org/showthread.php?t=816753


3
Đây là câu trả lời tốt nhất ở đây cho đến nay
Kỹ sư Dollery

Đẹp. Tốt hơn nhiều so với việc thay đổi cấu hình toàn hệ thống (có thể gây ra sự cố cho bạn với một số mô-đun python).
Gui Ambros

1
Đây là câu trả lời hữu ích nhất. Ngoài ra, trong một môi trường LC_ALLđã được đặt thành một cái gì đó không tương thích với các dotfile sắp xếp / nâng lên đầu lsdanh sách, alias ll='LC_ALL=C ls -alF'thay vào đó, hãy sử dụng , vì LC_COLLATEkhông ghi đè LC_ALL.
matty

8

Cài đặt

LC_ALL="C.UTF-8"

hoạt động tốt đối với tôi - umlauts và "ls -la" liệt kê các tập tin dấu chấm đầu tiên.


3
các tệp chấm được liệt kê đầu tiên, nhưng bây giờ tên tệp bắt đầu bằng chữ in hoa được liệt kê trước các tên bắt đầu bằng chữ thường.
Chnossos

1
+1 để đến gần hơn câu trả lời được chấp nhận, nhưng để tóm tắt các hạn chế: việc sắp xếp sẽ trở nên phân biệt chữ hoa chữ thường và ký tự nước ngoài - trong khi hiện được in chính xác do UTF-8- sẽ không được sắp xếp chính xác.
mkuity0

3
C.UTF-8là một miền địa phương không hợp lệ, vì vậy miền địa phương trở lại C. Bạn vẫn mất hỗ trợ UTF-8. Trên thực tế, điều đó thậm chí còn tồi tệ hơn vì LC_ALL=Chầu hết các chương trình hiển thị chính xác hầu hết các ký tự đa nhân , nhưng với LC_ALL=something_invalidmột số chương trình thì không (như `ls).
Martin Tournoij

@MartinTournoij nhưng nếu Stéphane Chazelas nói khác về các hệ thống GNU (có lẽ nói chung là Debian và Linux), điều đó có đúng không?
muru

@muru Tôi không chắc, tôi đoán bạn sẽ phải hỏi Stéphane chứ? Tất cả những gì tôi biết là localedường như có lỗi với LC_ALL=C.UTF-8: gist.github.com/Carpetsmoker/ef09b3734b29372939f97107413d7733 - đó là trên Arch Linux.
Martin Tournoij

3

Danh sách trang web ls (1):

-v sắp xếp tự nhiên các số (phiên bản) trong văn bản

Điều này dường như thay đổi cách các giai đoạn được sắp xếp và nhóm dotfiles đầu tiên. Tôi có:

alias ls='ls -vAF'
alias ll='ls -l'

trong ~ / .bashrc của tôi.


1

Một ý tưởng tắt tường

Disclaimer: Điều này sẽ là quá mức cần thiết cho hầu hết các bạn. Nhưng tôi đã làm điều này từ năm 1995 và tôi có kỹ năng để làm cho thế giới của mình chính xác như tôi muốn. Vì vậy, tôi tại sao không?

Tôi thực sự thích sử dụng các phương pháp sắp xếp khác nhau với ls, đặc biệt -rt(được sắp xếp theo ime rđã được sửa đổi t). Vì vậy, tôi quyết định thử một cái gì đó điên rồ và sử dụng awk để sắp xếp.

# save as ~/.ls.awk
# inpsired by http://superuser.com/questions/448291/how-can-i-make-ls-show-dotfiles-first

{
    if($1 == "total"){
        print $0
        next
    }
    # may need to adjust $9 to match your name column
    if(match($9, /^(\033\[[0-9]*m)*\./)) # optionally look past xterm highlighting like: ^[[34m
        df[++dd] = $0
    else
        nf[++nn] = $0
}
END{
    while (++d in df)
        print df[d]
    while (++n in nf)
        print nf[n]
}

Bây giờ thay vì xác định bí danh bash, tôi xác định hàm bash (vì bí danh chỉ có thể nối thêm các đối số ở cuối, nhưng các hàm có thể sử dụng chúng ở bất cứ đâu)

ll(){ CLICOLOR_FORCE=1 ls -lhA $* | awk -f ~/.ls.awk; }

Để xem kết quả

Hãy tạo một số tệp mẫu:

for n in 4 .4 3 .3 2 .2 1 .1; do touch $n; sleep 1; done

Sử dụng ls đồng bằng

$ ls -lA
total 8
-rw-r--r--  1 bbronosky  staff    0 Dec  1 00:25 .1
-rw-r--r--  1 bbronosky  staff    0 Dec  1 00:25 .2
-rw-r--r--  1 bbronosky  staff    0 Dec  1 00:25 .3
-rw-r--r--  1 bbronosky  staff    0 Dec  1 00:25 .4
-rwxr-xr-x  1 bbronosky  staff  285 Nov 29 13:14 .ls.awk
-rwxr-xr-x  1 bbronosky  staff    0 Dec  1 00:25 1
-rwxr-xr-x  1 bbronosky  staff    0 Dec  1 00:25 2
-rwxr-xr-x  1 bbronosky  staff    0 Dec  1 00:25 3
-rwxr-xr-x  1 bbronosky  staff    0 Dec  1 00:25 4
$ ls -lArt

total 8
-rwxr-xr-x  1 bbronosky  staff  285 Nov 29 13:14 .ls.awk
-rwxr-xr-x  1 bbronosky  staff    0 Dec  1 00:25 4
-rw-r--r--  1 bbronosky  staff    0 Dec  1 00:25 .4
-rwxr-xr-x  1 bbronosky  staff    0 Dec  1 00:25 3
-rw-r--r--  1 bbronosky  staff    0 Dec  1 00:25 .3
-rwxr-xr-x  1 bbronosky  staff    0 Dec  1 00:25 2
-rw-r--r--  1 bbronosky  staff    0 Dec  1 00:25 .2
-rwxr-xr-x  1 bbronosky  staff    0 Dec  1 00:25 1
-rw-r--r--  1 bbronosky  staff    0 Dec  1 00:25 .1

Sử dụng chức năng của tôi để lọc với awk

$ ll
total 8
-rw-r--r--  1 bbronosky  staff     0B Dec  1 00:25 .1
-rw-r--r--  1 bbronosky  staff     0B Dec  1 00:25 .2
-rw-r--r--  1 bbronosky  staff     0B Dec  1 00:25 .3
-rw-r--r--  1 bbronosky  staff     0B Dec  1 00:25 .4
-rwxr-xr-x  1 bbronosky  staff   285B Nov 29 13:14 .ls.awk
-rwxr-xr-x  1 bbronosky  staff     0B Dec  1 00:25 1
-rwxr-xr-x  1 bbronosky  staff     0B Dec  1 00:25 2
-rwxr-xr-x  1 bbronosky  staff     0B Dec  1 00:25 3
-rwxr-xr-x  1 bbronosky  staff     0B Dec  1 00:25 4

$ ll -rt
total 8
-rwxr-xr-x  1 bbronosky  staff   285B Nov 29 13:14 .ls.awk
-rw-r--r--  1 bbronosky  staff     0B Dec  1 00:25 .4
-rw-r--r--  1 bbronosky  staff     0B Dec  1 00:25 .3
-rw-r--r--  1 bbronosky  staff     0B Dec  1 00:25 .2
-rw-r--r--  1 bbronosky  staff     0B Dec  1 00:25 .1
-rwxr-xr-x  1 bbronosky  staff     0B Dec  1 00:25 4
-rwxr-xr-x  1 bbronosky  staff     0B Dec  1 00:25 3
-rwxr-xr-x  1 bbronosky  staff     0B Dec  1 00:25 2
-rwxr-xr-x  1 bbronosky  staff     0B Dec  1 00:25 1

Bạn có thể thấy triển khai của tôi ở đây https://github.com/RichardBronosky/dotfiles/commit/6170c0a9

Điều quan trọng nhất về điều này là nó là một khung để điều chỉnh lsđầu ra của bạn . Bạn có thể làm bất cứ điều gì bạn muốn với bộ lọc awk đó. Bạn có thể muốn nó là thư mục, sau đó là dotfiles, rồi mọi thứ khác. Một khi bạn biết cách xử lý màu xterm của mình, điều đó không quá khó. Điều đó hoàn toàn phụ thuộc vào bạn.


-1

Có thể thử điều này trong tệp .bashrc hoặc / etc / bashrc của bạn:

LS_OPTIONS='--color=tty -A -F -X -B -h -v -b -T 0 --group-directories-first';
export LS_OPTIONS;
alias ls='/bin/ls $LS_OPTIONS';

Điều này giả định rằng bạn đang chạy một phiên bản mới hơn của ls, lấy "--group-Directory-first" làm tùy chọn. Bạn rõ ràng có thể điều chỉnh các tùy chọn LS theo ý thích của bạn.


Điều gì --group-directories-firstphải làm với chương trình dotfiles đầu tiên của trò chơi?
G-Man nói 'Phục hồi Monica'
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.