Сортировка ls без учета регистра в Mac OSX


30

Как сделать lsкоманду в Max OS X Lion для сортировки файлов и каталогов, аналогично тому, как это делает Ubuntu Linux (без учета регистра, каталоги НЕ сверху, точечные файлы НЕ сверху)? В идеале я хотел бы сделать это без передачи вывода в другую команду, такую ​​как сортировка.

Например, я хочу увидеть:

foo
Foobar
MyStuff/
.stuff/
test.txt

вместо того:

.stuff
Foobar
MyStuff/
foo
test.txt

В Linux lsпорядок сортировки контролируется, в частности, локалью системы LC_COLLATE. Когда LC_COLLATE=en_US.UTF-8ls будет сортировать элементы так, как я хочу. Когда LC_COLLATE=C, lsбудет сортировать аналогично OS X.

LC_COLLATEустановлен en_US.UTF-8в OS X, но lsвсе еще сортирует по-старому POSIX. Кто-нибудь знает, как я могу заставить это вести себя как Linux?


Если это поможет: apple.stackexchange.com/a/22304/8546 отмечает , что HFS Plus обычно настроены быть чувствительны к регистру , но случай сохранения .
Грэм Перрин

Ответы:


16

Это может быть невозможно:

Взглянув на исходный код для ls , он использует strcoll для сортировки имен файлов, и поэтому должен учитывать LC_COLLATE.

Некоторые публикации в Интернете предполагают, что локали в BSD (и Darwin / OS X) несколько сломаны по сравнению с Linux. Я написал собственную программу быстрой сортировки, которая явно установила ее локаль и проверила ее на своем компьютере с помощью локалей en_US.UTF-8 и C (Mac OS 10.6.3) и университетского компьютера (Linux, FC11?). В то время как сортировка работает на машине с Linux, как и ожидалось («a B c» против «B a c»), mac всегда сортирует их как «B a c».

Источник: http://ask.metafilter.com/130292/CaseInsensitive-LS-on-Mac-OS-X

ОРИГИНАЛЬНЫЙ ОТВЕТ

Эта команда не сортирует точечные файлы, но показывает дополнительные списки каталогов

ls -f1 

Я подошел близко к этому:

.
..
.stuff
foo
Foobar
MyStuff
test.txt

1
Интересно, что «отключение сортировки» с параметром -f на самом деле, кажется, сортирует его, как и ожидалось. Я предполагаю, что это файловая система / HFS + сортировка записей с более "естественным" сопоставлением.
Джерри

6

Я знаю, что на это ответили, но эта работа лучше всего для меня:

ls -f1 -alF -G

Он перечисляет все детали и сортирует их, игнорируя регистр.


4

Это давало мне покой на некоторое время, и я, наконец, разобрался (хех). Попробовав несколько предложений, которые не сработали, вот что сработало.

Если вы готовы установить MacPorts (или Homebrew, или Fink), GNU-версия ls делает именно то, что вам нужно. Я сам использую MacPorts, поэтому я объясню этот подход:

  1. Загрузите и установите MacPorts:

    http://www.macports.org

  2. Установите пакет GNU Coreutils:

    sudo port install coreutils

  3. Теперь вы должны иметь GNU LS: gls. Попробуйте это в каталоге, который содержит элементы, которые начинаются с прописных и строчных букв:

    gls -U

    ( -UОпция фактически означает «несортированный», но в OS X это дает желаемый эффект, заключающийся в том, что он не учитывает регистр.)

  4. Добавьте этот псевдоним в свой файл, .bash_profileчтобы обычный lsработал так, как вы этого хотите (мне нравится вывод цвета, но вы можете пропустить его, если хотите; вам нужен только -U):

    alias ls='gls -U --color'

Обратите внимание, что эта -Uопция, вероятно, не будет работать на других платформах. В OS X это всегда кажется правильным (возможно, потому что HFS + эффективно нечувствителен к регистру - «учитывает регистр», технически), но если вы попробуете это на Linux-коробке, результаты, скорее всего, просто не будут отсортировано на всех.


1
3. кажется, больше не имеет желаемого побочного эффекта (опция -U) под macOS> = 10.13 из-за новой APFS.
Мариус Хоферт

1
Да ... не похоже, что есть какой-либо способ сделать это с APFS.
Джейсон Симс

Подтвердите, работает на 10.12, хотя. Благодарность!
Полковник Паника

4

В дополнение к тому, что Майк написал выше, я пошел дальше и нашел способ определить свои собственные правила сортировки.

Определения локали находятся в / usr / share / locale /. Каждая папка является локалью и имеет файл (или ссылку) LC_COLLATE, который определяет, какие символы являются «одинаковыми» (например, что U, u и ü должны считаться одинаковыми при заказе). Вы можете дублировать каталог, и это создаст новое определение локали:

$ sudo cp -R en_GB.UTF-8/ en_GB.UTF-8-CI/

Теперь у вас будет новый языковой стандарт под названием 'en_GB.UTF-8-CI' ('CI' для нечувствительного к регистру), и вы сможете использовать LC_COLLATE оттуда.

Теперь, чтобы изменить LC_COLLATE в новой локали, вы можете скачать источники локали с http://www.opensource.apple.com/source/adv_cmds/adv_cmds-119/usr-share-locale.tproj/colldef/ , отредактировать это ближе всего к тому, что вы хотите и запустить

$ colldef < <new collation file>
$ sudo cp LC_COLLATE /usr/share/locale/en_GB.UTF-8-CI/

и теперь, когда ты бежишь

$ LC_COLLATE=en_GB.UTF-8-CI ls

у вас будет сортировка по вашим правилам.

Да, это то, что нужно для того, чтобы сделать сортировку 'ls' без учета регистра.


2

В качестве обходного пути вы можете использовать функцию и псевдоним:

function lssorted() { /bin/ls "$@" | sort -f ;}
alias ls='lssorted'

Это создает нечувствительный к регистру вывод для стандартной команды ls.


1
Я должен отметить: это потерпит неудачу, если, например, -l используется. Затем ls создает еще одну строку «total X» в начале, которая также будет отсортирована.
Арне

2

С помощью

ls -f

работает для меня.

-f официально отключает любую сортировку, но похоже, что тогда просвечивает оригинальная сортировка HFS, что в точности учитывает регистр.

Я думаю, это на самом деле зависит от того, чувствителен ли к вашему HD формат с учетом регистра или нет, но поскольку формат HFS без учета регистра используется по умолчанию для системных дисков Mac OS X, это должно работать для большинства пользователей.


Это определенно правильный ответ. Единственная проблема с ним заключается в том, что он также неявно включает -a, и его невозможно отключить, что покажет вам файлы / папки, начиная с точки, в том числе. а также .. .
Ленсовет

1
Другая проблема (сейчас) заключается в том, что из-за новой APFS это больше не работает под macOS> = 10.13.
Мариус Хоферт

1

Вдохновленный ответом Майка, я добавил следующее в / etc / bashrc, и это прекрасно работает в Мохаве. При добавлении -a в конце перечисляются скрытые файлы, но это меня не беспокоит.

export LC_COLLATE="cs_CZ.ISO8859-2"; alias ls='ls -lhFG'

Вы можете увидеть новую конфигурацию, запустив команду locale. Чтобы вернуться, просто удалите строку из / etc / bashrc и войдите обратно в терминал.

$ locale
LANG="en_US.UTF-8"
LC_COLLATE="cs_CZ.ISO8859-2"
LC_CTYPE="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_ALL=

Обратите внимание, что ни ls -f1, ни ls -f у меня не работали в Мохаве. Я получил действительно несортированный список. Только решение, которое я предоставил, работало для меня в Мохаве.


Лучший ответ, но приведенный пример делает слишком много. Это должно быть урезано до: вставьте следующую строку в ваш .bashrcили .zshrc:alias ls="LC_COLLATE=cs_CZ.ISO8859-2 ls"
user1561489

0

Бег:

$ type ls

Вы, вероятно, обнаружите, что ваша lsкоманда является псевдонимом.


В Linux: ls is /bin/ls. На OS X: ls is hashed (/bin/ls). В любом случае, даже если я позвоню /bin/lsнапрямую, он все равно не сортируется в соответствии с LC_COLLATE.

2
Это удивительно, я бы поставил, что ваша lsкоманда была добавлена --group-directories-first. Это может все еще быть сделано где-то еще, только не псевдоним.
MikeyB

0

Если вас в основном интересует порядок сортировки файлов точек, вы можете сортировать по расширению : используйте lsкоманду из GNU Fileutils с опцией --sort=extension. (Вы можете установить GNU Fileutils, например, через macports.)


0

ls сортирует в соответствии с LC_COLLATE, просто большинство файлов LC_COLLATE настроены на сортировку с учетом регистра. http://collation-charts.org/fbsd54/

Для сортировки без учета регистра заданы два параметра: cs_CZ.ISO8859-2 и et_EE.ISO8859-15 et_EE.ISO8859.15 не сортирует «Z» так, как хотелось бы носителям английского языка. cs.CZ.ISO8859-15 хорошо справляется с алфавитом, я просто хотел бы, чтобы он сортировал "~" перед алфавитными символами.

Мое решение: LC_COLLATE = cs_CZ.ISO8859-2 / bin / ls -FG

Интересно, можно ли создать собственный файл LC_COLLATE для обработки "." так, как вы хотите, и «~», как я хочу.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.