Как сделать так, чтобы «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

Что я сделал, что заставило 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
clang1234
источник

Ответы:

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.

slhck
источник
2
Установка LC_ALL = "C" сделала свое дело! Спасибо за быстрый ответ
clang1234
8
При установке LC_ALL = "C" lsимена файлов Unicode на иностранных языках (например, на японском языке) будут такими как????????
ohho
Обратите внимание, что, добавляя export LC_ALL="C"в свои файлы точек, вы фактически потеряете поддержку своей текущей локали во всех утилитах, поддерживающих локали. Хотя проблема печати , на которую указывает @ohho, может быть решена с помощью ответа Фарула , вы будете вводить проблемы с сортировкой : сортировка будет выполняться только по байтовому значению, что приведет к сортировке, которая (а) неожиданно чувствительна к регистру и (б) неизменно помещает акцентированные символы. после всех без акцента.
mklement0
35

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

alias ll='LC_COLLATE=C ls -alF'

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

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

Андрей Лоскутов
источник
3
Это лучший ответ здесь
инженер Dollery
Прекрасный. Гораздо лучше, чем изменение общесистемной конфигурации (что может вызвать проблемы с некоторыми модулями Python).
Ги Амброс
1
Это был самый полезный ответ. Кроме того, в среде, где LC_ALLуже установлено что-то несовместимое с сортировкой / переносом файлов точек в начало lsсписка, используйте alias ll='LC_ALL=C ls -alF'вместо этого, потому LC_COLLATEчто не переопределяет LC_ALL.
Мэтти
8

настройка

LC_ALL="C.UTF-8"

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

Faroul
источник
3
Файлы с точками указываются первыми, но теперь имена файлов, начинающиеся с заглавной буквы, отображаются раньше, чем имена, начинающиеся со строчной буквы.
Chnossos
1
+1 для того, чтобы приблизиться к принятому ответу, но суммировать ограничения: сортировка станет чувствительной к регистру , а иностранные символы - хотя теперь печатаются правильно из-за UTF-8- не будут отсортированы правильно.
mklement0
3
C.UTF-8неверная локаль, поэтому локаль возвращается к C. Вы все еще теряете поддержку UTF-8. На самом деле, это даже хуже, так LC_ALL=Cкак большинство программ правильно отображают большинство многобайтовых символов , но в LC_ALL=something_invalidнекоторых программах нет (например, `ls).
Мартин Турной
@MartinTournoij, но если Стефан Шазелас говорит иначе о системах GNU (так, по-видимому, Debian и Linux в целом), то что правильно?
Муру
@muru Я не уверен, наверное, тебе придется спросить Стефана? Все, что я знаю, это то, что, localeпохоже, ошибка с LC_ALL=C.UTF-8: gist.github.com/Carpetsmoker/ef09b3734b29372939f97107413d7733 - то есть в Arch Linux.
Мартин Турной
4

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

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

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

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

в моем ~ / .bashrc.

Винс Валенти
источник
1

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

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

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

Фил
источник
Какое отношение это --group-directories-firstимеет к «сначала показывать точечные файлы»?
G-Man говорит: «Восстановите Монику»