Скажите `ls` сортировать по обычным кодам ASCII, а не“ разумно ”

13

У меня есть несколько файлов и lsсортирует их так:

a
_b
c

но я хочу иметь

_b
a
c

Как я могу это сделать?

Мартин Уединг
источник
2
Могу я спросить почему?
RolandiXor
2
Я использую подчеркивание для обозначения специальных каталогов, которые должны идти вверх. В моей папке проектов есть proj_a, proj_b и _old_projects. Бесполезно, если эта папка находится в o-проектах.
Мартин Юдинг

Ответы:

9

В качестве одноразовой команды вы можете сделать это:

LC_COLLATE=C ls

Или вы можете добавить export LC_COLLATE="C"в свой .bashrc, чтобы сделать его постоянным (может иметь неожиданные результаты сортировки в другом месте).

Больше информации на форумах Ubuntu .

misterben
источник
1
Я думаю, что я просто псевдоним ls с этим, чтобы он не имел побочных эффектов.
Мартин Юдинг
Это не работает для меня. Я получил это -> paste.pocoo.org/show/403333 (это немецкий, но это не должно иметь значения)
dAnjou
2
@dAnjou LC_COLLATE=Cls устанавливает традиционный порядок сортировки POSIX, то есть ASCII, в котором заглавные буквы ставятся перед подчеркиванием. Чтобы сортировка подчеркиваний выполнялась в верхнем регистре, вам нужно попасть под капот и создать собственное определение локали в / usr / share / i18n / locales.
Мистербен
2
Возможно, это работало в прошлом, но это не работает на Ubuntu 12.04.
Микель
1
Начиная с Ubuntu 14.04, LC_COLLATE=C lsне работает, но LC_ALL=C lsработает.
jwodder
6

На случай, если для этого нет встроенного способа, вы можете использовать простую замену sort:

#!/usr/bin/env python

import sys

for i in sorted(sys.stdin):
    sys.stdout.write(i)

Сохраните его, например, в /bin/pysortи сделайте его исполняемым ( sudo cp whatever.py /bin/pysortи sudo chmod a+x /bin/pysort), и запустите его как ls | pysort:

stefano@lenovo:~/t$ ls | pysort
_b
a
c
Стефано Палаццо
источник
1
Я бы, наверное, положил, ~/binно хороший запасной вариант. Вероятно, лучше использовать globbing внутри python, поскольку вывод ls может быть странным, если имя файла содержит символ новой строки.
Мартин Юдинг
1

ls | sortне будет делать именно то, что вам нужно?

Филипп де Брауэр
источник
1
нет, это сортируется как "a _b c"
Стефано Палаццо
1
нет! и сортировка также не имеет возможности для этого :-)
Rinzwind
2
Странно, что у сортировки есть так много специальных способов сортировки, но не один «используйте значение ASCII»…
Мартин Уединг,