39

Где-то по пути я облажался с моей командой 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

Что я сделал, что заставило ls игнорировать файлы точек и вместо этого упорядочивать по первой букве?

Выход 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

6 ответов6

43

Попробуйте добавить

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 .

31

Чтобы избежать каких-либо системных изменений без реальной необходимости, можно изменить только способ работы ls для текущего пользователя, добавив псевдоним в .bashrc:

alias ll='LC_COLLATE=C ls -alF'

Это сначала сортирует файлы точек, позволяет правильно обрабатывать (показывать и сортировать) "необычные" наборы символов, такие как кириллица. Единственный виновник, что сортировка будет чувствительна к регистру.

Источник: http://ubuntuforums.org/showthread.php?t=816753

7

настройка

LC_ALL="C.UTF-8"

у меня нормально работает - сначала умлаутс и "ls -la" перечисляют точечные файлы.

1

Список man-страниц ls(1):

-v натуральный вид (версии) чисел в тексте

Кажется, это меняет порядок сортировки периодов и сначала группирует точечные файлы. Я имею:

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

в моем ~/.bashrc.

1

Идея вне стены

Отказ от ответственности: это будет излишним для большинства из вас. Но я занимаюсь этим с 1995 года, и у меня есть навыки, чтобы сделать мой мир именно таким, каким я этого хочу. Итак, почему бы и нет?

Я действительно , как с использованием различных методов сортировки с ls особенно -rt (который является сортировать по r everse модифицирована t IME). Итак, я решил попробовать что-то сумасшедшее и использовать 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

$ 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-directoryies-first. Вы можете явно настроить параметры LS по своему вкусу.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .