Создайте следующие файлы в каталоге.
$ touch .a .b a b A B 你好嗎
Мой ls
порядок по умолчанию игнорирует наличие начальных точек, смешивая их с другими файлами.
$ ls -Al
total 0
-rw-r--r-- 1 sparhawk sparhawk 0 Jun 8 17:03 a
-rw-r--r-- 1 sparhawk sparhawk 0 Jun 8 17:03 .a
-rw-r--r-- 1 sparhawk sparhawk 0 Jun 8 17:03 A
-rw-r--r-- 1 sparhawk sparhawk 0 Jun 8 17:03 b
-rw-r--r-- 1 sparhawk sparhawk 0 Jun 8 17:03 .b
-rw-r--r-- 1 sparhawk sparhawk 0 Jun 8 17:03 B
-rw-r--r-- 1 sparhawk sparhawk 0 Jun 8 17:06 你好嗎
Я могу изменить, LC_COLLATE
чтобы поместить точечные файлы в первую очередь.
$ LC_COLLATE=C ls -Al
total 0
-rw-r--r-- 1 sparhawk sparhawk 0 Jun 8 17:03 .a
-rw-r--r-- 1 sparhawk sparhawk 0 Jun 8 17:03 .b
-rw-r--r-- 1 sparhawk sparhawk 0 Jun 8 17:03 A
-rw-r--r-- 1 sparhawk sparhawk 0 Jun 8 17:03 B
-rw-r--r-- 1 sparhawk sparhawk 0 Jun 8 17:03 a
-rw-r--r-- 1 sparhawk sparhawk 0 Jun 8 17:03 b
-rw-r--r-- 1 sparhawk sparhawk 0 Jun 8 17:06 你好嗎
К сожалению, это делает порядок сортировки чувствительным к регистру, то есть A
и B
предшествует a
и b
. Есть ли способ сначала напечатать точечные файлы, оставаясь без учета регистра ( A
и a
предшествовать B
и b
)?
Изменить: попытка изменить LC_COLLATE
Ни один из ответов до сих пор полностью не повторяет функционал ls
легко. Возможно, я мог бы обернуть некоторые из них в функцию, но это должно было бы включать некоторый подробный код (например), как работать без аргументов, а не указывать каталог в качестве аргумента. Или как бороться с явным -d
флагом.
В качестве альтернативы я подумал, что может быть лучше LC_COLLATE
использовать. Тем не менее, я не могу заставить эту работу. Я сейчас пользуюсь LC_COLLATE="en_AU.UTF-8"
. Я проверил /usr/share/i18n/locales/en_AU
(хотя я не уверен, что это правильный файл, так как я не вижу ссылок на него UTF-8
); Я нашел следующее.
LC_COLLATE
copy "iso14651_t1"
END LC_COLLATE
/usr/share/i18n/locales/iso14651_t1
содержит copy "iso14651_t1_common"
. Наконец, /usr/share/i18n/locales/iso14651_t1_common
содержит
<U002E> IGNORE;IGNORE;IGNORE;<U002E> # 47 .
Я удалил эту строку, запустил sudo locale-gen
и перезагрузил компьютер. К сожалению, это ничего не изменило.
$@
.Вы можете использовать порядок сортировки командного интерпретатора вместо (который не может включать в себя параметры сортировки порядок локали;
bash
, AT & Tksh
,yash
,tcsh
иzsh
дают ожидаемые результаты,mksh
иdash
. Неfish
кажется , чтобы дать регистрозависимости порядок , но дает разные результаты , когда Есть не-ASCII символы):Это дает
ls
явный список файлов (и каталогов) для списка и деактивируетls
сортировку (-U
которая является расширением GNU).Есть несколько предостережений, в зависимости от используемой вами оболочки.
zsh
использованииnomatch
опции по умолчанию команда не будет выполнена, если каталог не содержит скрытых и не скрытых файлов; Вы могли бы отключить,nomatch
чтобы избежать этого, но лучше было бы сделать этоset -o cshnullglob
вместо этого (и команда потерпела бы неудачу, только если ни один из глобусов не соответствует, как в(t)csh
ранних или ранних оболочках Unix).zsh
,pdksh
и его производная иfish
,.*
расширение не включает.
и..
, так что это соответствуетls -Al
. С другими снарядами.
и..
включены, чтобы он соответствовалls -al
. В последнем случае вам нужно изменить шаблоны сглаживания, чтобы исключить.
и..
(ls -dUl -- ..?* .[!.]* *
).fish
,(t)csh
илиzsh
, если какой-либо из шаблонов слияния не совпадает с чем-либо,ls
выдаст сообщение об ошибке; Вы можете избежать этого, установивnullglob
параметр (вbash
илиzsh
по крайней мере), или перенаправивstderr
на/dev/null
(ls -dUl -- ..?* .[!.]* * 2>/dev/null
). Если вы используетеnullglob
, обратите внимание на потенциально удивительное поведение, которое вызывает (см. Shell поедает символы `?` ).fish
ведет себя какbash
с темnomatch
исключением, что в интерактивном режиме выдается предупреждающее сообщение для каждого глобуса, который не соответствует.(Спасибо Стефану Шазеласу за все отзывы!)
источник
mksh
и,dash
например, не будет сортировать без учета регистра.-U
(что означает несортированный) является расширением GNU. У некоторых другихls
реализаций, таких как FreeBSD, есть,-U
но это не для несортированного списка.ls
вам нужно--
до этого, так.*
как эта реализация принимает параметры после аргументов (если только POSIXLY_CORRECT не находится в среде)ls
в качестве аргумента.[!.]
правильно. См. Pubs.opengroup.org/onlinepubs/9699919799/utilities/… . Некоторые (большинство?) Оболочки допускают использование^
в качестве синонимов!
в глобусах класса символов с отрицанием. В любом случае, я предпочитаю.[!.] .??* *
быть немного более понятным, чем.[!.]* ..?* *
Вы можете просто использовать две отдельные
ls
команды:В отличии от других ответов до сих пор, этот подход показывает дот файлов первой Избегая
.
и..
записи, затем остальные элементы вls
алфавитном порядке.Ответы @StephenKitt могут быть улучшены, хотя для достижения того же результата:
источник
ls
в качестве аргумента. (FWIW я использую zsh, но это полезно для bash-людей, я полагаю.)Вы можете играть с опциями команды ls . Попробуй это:
Где:
источник
-X
Флаг сортирует расширение после того.
, который полностью отличается. Кроме того, файлы в обратном алфавитном порядке. Кроме того, хотя точечные файлы являются первыми для моего примера, они не будут работать во всех случаях (напримерa.b
c.d
.a
.c
). Кроме того, вы использовали-a
вместо-A
.