Як я можу спочатку зробити «ls» показ точкових файлів?


46

Десь по дорозі я накрутив свою команду ls і тепер отримую це замовлення під час запуску

$ 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

Що я зробив, щоб змусив ігнорувати точкові файли і замість цього замовити першу букву?

Вихід 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

Відповіді:


47

Спробуйте додати

export LC_COLLATE="C"

у ваших точкових файлах або змінивши LC_ALLпризначення на:

export LC_ALL="C"

Це керує способом сортування за рівнем символів - хоча за замовчуванням буде сортувати точкові файли вбудовані, це sortспочатку зробить список точкових файлів.

Однак зауважте, що це в основному зупинить підтримку вашого фактичного локалу в усіх утилітах, що знають локальну мову.


Щоб піти далі, цитуючи посібник з GNU Coreutils (моє наголос):

Якщо ви використовуєте локаль НЕ-POSIX (наприклад, шляхом установки LC_ALLв en_US), то сорт може виробляти висновок, відсортоване по- іншому , ніж ви звикли.

У цьому випадку встановіть LC_ALLзмінну середовища на C. Зауважте, що налаштування LC_COLLATEмає лише дві проблеми. По-перше, він неефективний, якщо LC_ALLйого також встановлено. По-друге, він має невизначене поведінку, якщо LC_CTYPE(або LANG, якщо LC_CTYPEвоно не встановлено) встановлено несумісне значення. Наприклад, ви не LC_CTYPEвизначаєте поведінку, якщо є, ja_JP.PCKале LC_COLLATEє en_US.UTF-8.


2
Налаштування LC_ALL = "C" зробило трюк! Дякую за швидку відповідь
clang1234

7
Якщо встановити LC_ALL = "C", lsім'я юнікоду (наприклад, японська) має ????????
однокоректні

Зауважте, що додаючи export LC_ALL="C"до своїх файлів dotfiles, ви фактично втратите підтримку свого фактичного локалу в усіх утилітах, що знають локальну мову. Хоча проблема друку , на яку вказує @ohho, може бути усунена відповіддю Фарула , ви введете проблеми зі сортуванням : сортування відбуватиметься лише за байтовим значенням, в результаті чого сортування буде (а) несподівано чутливим до регістру та (b) незмінним наголошені знаки. після того, як всі , не акцентувати з них.
mklement0

35

Щоб уникнути будь-яких системних змін без реальної потреби, можна змінити лише спосіб lsроботи поточного користувача, додавши псевдонім до .bashrc:

alias ll='LC_COLLATE=C ls -alF'

Цей сортування точкових файлів спочатку дозволяє правильно обробляти (показувати та сортувати) "незвичайні" набори символів, як кирилиця. Єдиний винуватець, що сортування буде залежно від регістру.

Джерело: http://ubuntuforums.org/showthread.php?t=816753


3
Це найкраща відповідь на сьогодні
інженер Доллері

Гарний. Набагато краще, ніж зміна конфігурації загальної системи (що може спричинити проблеми з деякими модулями пітона).
Gui Ambros

1
Це була найкорисніша відповідь. Крім того, в середовищі, де LC_ALLвже встановлено щось, що не сумісне з сортуванням / підйомом точкових файлів у верхній частині lsсписку, використовуйте alias ll='LC_ALL=C ls -alF'натомість, оскільки LC_COLLATEце не перекриває LC_ALL.
матовий

8

Налаштування

LC_ALL="C.UTF-8"

працює добре для мене - umlauts та "ls -la" спочатку перераховують крапки-файли.


3
Файли з крапками перераховуються спочатку, але тепер імена файлів, які починаються з великої літери, перераховані перед тими, що починаються з малої літери.
Chnossos

1
+1 для того, щоб наблизитись до прийнятої відповіді, але для узагальнення обмежень: сортування стане чутливим до регістру , а іноземні символи - поки вони надруковані правильно через UTF-8- не будуть сортовані правильно.
mklement0

3
C.UTF-8недійсна локаль, тому мова повертається назад до C. Ви все ще втрачаєте підтримку UTF-8. Насправді це ще гірше, оскільки LC_ALL=Cбільшість програм правильно відображає більшість багатобайтових символів , але в LC_ALL=something_invalidдеяких програмах немає (наприклад, ls).
Мартін Турнойж

@MartinTournoij, але якщо Stéphane Chazelas говорить інакше про системи GNU (так, мабуть, Debian і Linux взагалі), це правильно?
муру

@muru Я не впевнений, я думаю, вам доведеться запитати Стефана? Все, що я знаю, - це, localeздається, помилка з LC_ALL=C.UTF-8: gist.github.com/Carpetsmoker/ef09b3734b29372939f97107413d7733 - тобто в Arch Linux.
Martin Tournoij

3

Список сторінок ls (1):

-v природний вид (версія) чисел у тексті

Здається, це змінить спосіб сортування періодів і спочатку групує точкові файли. Я маю:

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

в моєму ~ / .bashrc.


1

Ідея від стіни

Відмова від відповідальності: для більшості з вас це буде зайвим. Але я цим займаюся з 1995 року і маю навички зробити свій світ саме таким, як я цього хочу. Отже, я чому ні?

Мені дуже подобається використовувати різні методи сортування ls, особливо -rt(це rсортується за вічно модифікованим ім'ям t). Отже, я вирішив спробувати щось божевільне і використаю awk, щоб зробити своє сортування.

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

Тепер замість визначення псевдоніма bash я визначаю функцію bash (тому що псевдоніми можуть додавати аргументи лише в кінці, але функції можуть використовувати їх будь-де)

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

Щоб побачити результати

Створимо кілька зразкових файлів:

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

Використовуючи просту лс

$ 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

Використовуючи мою функцію, яка фільтрує з 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

Ви можете побачити мою реалізацію цього тут https://github.com/RichardBronosky/dotfiles/commit/6170c0a9

Що найважливіше в цьому, це те, що це основа для налаштування lsрезультатів. З цим фільтром awk ви можете робити все, що завгодно. Можливо, ви хочете, щоб це були каталоги, тоточні файли, то все інше. Коли ви знаєте, як поводитися зі своїми кольорами xterm, це не надто складно. Це повністю залежить від вас.


-1

Можна спробувати це у файлі .bashrc або / etc / bashrc:

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

Це передбачає, що ви використовуєте дещо новішу версію ls, яка приймає "--group-каталоги-перший" як варіант. Ви, очевидно, можете налаштувати параметри LS на свій смак.


Що стосується --group-directories-first"спочатку показати dotfiles"?
G-Man каже: "Відновіть Моніку"
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.