Bagaimana saya bisa membuat "ls" menunjukkan dotfiles pertama?

46

Di suatu tempat di sepanjang jalan saya mengacaukan perintah ls saya dan sekarang saya mendapatkan pemesanan ini ketika berjalan

$ 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

Apa yang saya lakukan yang membuat saya mengabaikan dotfiles dan memesan dengan huruf pertama?

Output dari 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
dentang1234
sumber

Jawaban:

47

Coba tambahkan

export LC_COLLATE="C"

di dotfile Anda, atau mengubah LC_ALLtugas ke:

export LC_ALL="C"

Ini mengontrol cara pengurutan pada level karakter berfungsi - sementara defaultnya adalah mengurutkan dotfiles sebaris, ini akan membuat sortdaftar dotfiles pertama.

Namun, perhatikan bahwa ini pada dasarnya akan menghentikan dukungan untuk lokal Anda yang sebenarnya di semua utilitas yang sadar-lokal.


Untuk melangkah lebih jauh, mengutip manual GNU Coreutils (penekanan milik saya):

Jika Anda menggunakan lokal non-POSIX (misalnya, dengan mengatur LC_ALLke en_US), maka sort dapat menghasilkan output yang diurutkan secara berbeda dari yang biasa Anda lakukan.

Dalam hal itu, atur LC_ALLvariabel lingkungan ke C. Perhatikan bahwa pengaturan hanya LC_COLLATEmemiliki dua masalah. Pertama, itu tidak efektif jika LC_ALLjuga diatur. Kedua, ia memiliki perilaku yang tidak terdefinisi jika LC_CTYPE(atau LANG, jika LC_CTYPEtidak disetel) diatur ke nilai yang tidak kompatibel. Misalnya, Anda mendapatkan perilaku tidak terdefinisi jika LC_CTYPEini ja_JP.PCKtapi LC_COLLATEadalah en_US.UTF-8.

slhck
sumber
2
Pengaturan LC_ALL = "C" berhasil! Terima kasih atas tanggapan
cepatnya
8
Mengatur LC_ALL = "C" akan lsbahasa asing (mis. Jepang) unicode nama file sebagai????????
ohho
Perhatikan bahwa dengan menambahkan export LC_ALL="C"dotfile Anda, Anda akan kehilangan dukungan untuk lokal Anda yang sebenarnya di semua utilitas yang sadar-lokal. Sementara masalah pencetakan yang ditunjukkan oleh @ohho dapat diatasi dengan jawaban Faroul , Anda akan memperkenalkan masalah penyortiran : penyortiran akan terjadi hanya dengan nilai byte, menghasilkan penyortiran yang (a) tidak terduga case-sensitive , dan (b) selalu tempat aksen chars. setelah semua yang tidak beraksen.
mklement0
35

Untuk menghindari perubahan sistem yang luas tanpa kebutuhan nyata, seseorang hanya dapat mengubah cara lskerjanya bagi pengguna saat ini dengan menambahkan alias ke .bashrc:

alias ll='LC_COLLATE=C ls -alF'

Ini mengurutkan file dot terlebih dahulu, memungkinkan untuk menangani dengan benar (menampilkan dan mengurutkan) set karakter "tidak umum" seperti huruf kecil. Satu-satunya pelakunya adalah penyortiran akan case-sensitive.

Sumber: http://ubuntuforums.org/showthread.php?t=816753

Andrey Loskutov
sumber
3
Ini adalah jawaban terbaik di sini sejauh ini
Insinyur Dollery
Indah. Jauh lebih baik daripada mengubah konfigurasi seluruh sistem (yang dapat menyebabkan Anda bermasalah dengan beberapa modul python).
Gui Ambros
1
Ini adalah jawaban yang paling membantu. Selain itu, di lingkungan di mana LC_ALLsudah disetel ke sesuatu yang tidak kompatibel dengan pengurutan / pengangkat dotfiles ke bagian atas lsdaftar, gunakan alias ll='LC_ALL=C ls -alF'sebaliknya, karena LC_COLLATEtidak menimpa LC_ALL.
matty
8

Pengaturan

LC_ALL="C.UTF-8"

berfungsi dengan baik untuk saya - umlauts dan "ls -la" mendaftar dot-file terlebih dahulu.

Faroul
sumber
3
file dot terdaftar terlebih dahulu, tetapi sekarang nama file yang dimulai dengan huruf besar terdaftar sebelum yang dimulai dengan huruf kecil.
Chnossos
1
+1 untuk lebih dekat dari jawaban yang diterima, tetapi untuk merangkum batasan: penyortiran akan menjadi case-sensitive , dan karakter asing - saat ini dicetak dengan benar karena UTF-8- tidak akan diurutkan dengan benar.
mklement0
3
C.UTF-8adalah lokal yang tidak valid, jadi lokal kembali ke C. Anda masih kehilangan dukungan UTF-8. Bahkan, ini lebih buruk karena LC_ALL=Csebagian besar program menampilkan sebagian besar karakter multibyte dengan benar , tetapi dengan LC_ALL=something_invalidbeberapa program tidak (seperti `ls).
Martin Tournoij
@ MartinTournoij tetapi jika Stéphane Chazelas mengatakan sebaliknya tentang sistem GNU (jadi mungkin Debian dan Linux secara umum), mana yang benar?
muru
@muru Saya tidak yakin, saya kira Anda harus bertanya kepada Stéphane? Yang saya tahu adalah bahwa localetampaknya kesalahan dengan LC_ALL=C.UTF-8: gist.github.com/Carpetsmoker/ef09b3734b29372939f97107413d7733 - yang ada di Arch Linux.
Martin Tournoij
4

Daftar manual ls (1):

-v Jenis semacam alami (versi) dalam teks

Ini tampaknya mengubah cara periode diurutkan dan melakukan dotfil grup terlebih dahulu. Saya sudah:

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

di ~ / .bashrc saya.

Vince Valenti
sumber
1

Gagasan dinding

Penafian: Ini akan berlebihan bagi sebagian besar dari Anda. Tapi saya sudah melakukan ini sejak 1995 dan saya memiliki keterampilan untuk membuat dunia saya persis seperti yang saya inginkan. Jadi, mengapa tidak?

Saya sangat suka menggunakan metode penyortiran yang berbeda dengan ls, terutama -rt(yang disortir dengan ime rdimodifikasi tterbalik). Jadi, saya memutuskan untuk mencoba sesuatu yang gila dan menggunakan awk untuk melakukan penyortiran saya.

# 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]
}

Sekarang alih-alih mendefinisikan alias bash, saya mendefinisikan fungsi bash (karena alias hanya dapat menambahkan argumen di bagian akhir, tetapi fungsi dapat menggunakannya di mana saja)

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

Untuk melihat hasilnya

Mari kita membuat beberapa file sampel:

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

Menggunakan ls

$ 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

Menggunakan fungsi saya yang memfilter dengan 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

Anda dapat melihat implementasi saya di sini di sini https://github.com/RichardBronosky/dotfiles/commit/6170c0a9

Apa yang paling penting tentang ini adalah bahwa itu adalah kerangka kerja untuk mengutak-atik lsoutput Anda . Anda dapat melakukan apa pun yang Anda inginkan dengan filter awk itu. Anda mungkin ingin itu menjadi direktori, lalu dotfile, lalu yang lainnya. Setelah Anda tahu cara menangani warna xterm Anda, itu tidak terlalu sulit. Ini sepenuhnya terserah Anda.

Bruno Bronosky
sumber
-1

Mungkin coba ini di file .bashrc atau / etc / bashrc Anda:

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';

Ini mengasumsikan Anda menjalankan versi ls yang agak baru yang menggunakan "--group-directories-first" sebagai opsi. Anda jelas dapat mengubah opsi LS sesuai keinginan Anda.

Phil
sumber
Apa yang --group-directories-firstharus dilakukan dengan “tunjukkan dotfiles terlebih dahulu”?
G-Man Berkata 'Reinstate Monica'