Сортировка "ls" в Unix по имени

127

Можете ли вы отсортировать список ls по имени?

Деванг Камдар
источник
10
Если он не сортируется по имени без каких-либо аргументов, вы можете проверить, был ли ls связан с чем-то другим, или просто вызвать его, используя полный путь, что устранит любые существующие псевдонимы.
tvanfosson
gnu-coreutils ls сортирует по умолчанию. Какую систему вы используете (как спрашивают другие)
Ник Фортескью
Вы уверены, что просите сортировать по имени, а не по типу (т.е. сначала каталог, а затем файлы) ??
curtisk
Заглавные буквы идут перед строчными, таким образом, файл Z идет перед файлом a ... как это исправить?
ArtOfWarfare
На странице руководства написано «отсортировано отдельно и в лексикографическом порядке». Файлы сортируются по первому символу: числовые [0..9] и ВЕРХНИЕ символы [A..Z] и нижние символы [a..z]
Гюрол Канбек

Ответы:

131

My ls по умолчанию сортирует по имени. Что вы видите?

man ls состояния:

List information about the FILEs (the current directory by default). Sort entries alpha‐betically if none of -cftuvSUX nor --sort is specified.:

выворачивать наизнанку
источник
lsне сортирует, если -c1указано: есть ли способ сделать это? ( --sort=nameпохоже, не работает)
dhc
1
Это неправда. с ls -la, я вижу:, .bashrc - can - .config - Downloads - .local - tmpсортировка будет имя будет:.bashrc - .config - .local - Downloads - can - tmp
12431234123412341234123
1
мой говорит, что 100.jpg предшествует 10.jpg. Думаю, имеет смысл, если "0" стоит перед "". но это все еще не интуитивно
понятно
Я вижу букву «М» перед буквой «б». Смущенный. Подождите, а заглавные буквы имеют значение?
Дэниел Спрингер
106

Для чего-то простого вы можете комбинировать ls с sort . Просто список имен файлов:
ls -1 | Сортировать

Чтобы отсортировать их в обратном порядке:
ls -1 | sort -r

отметка
источник
3
Есть ли способ отсортировать файлы так: ls | sort -n 1.1.1; 1.1.2; 1.1.3; 2.10.1; 2.10.15; 2.10.2; 2.10.20; 2.10.21; 2.1.1; 2.1.10; 2.1.15; 2.1.2; 2.1.3; 2.1.4; 10.1.1; 10.1.2; 10.1.3; 11.0.1; 11.0.2; 11.0.20; 11.0.21; 11.0.22; Как вы видите, 2.10.15 до 2.10.2 .
BBK
Я занимаюсь разработкой для Android на устройстве Pidion, и ls не выполняет автоматическую сортировку, так что это было очень полезно! Единственная проблема в том, что похоже, что он сортирует мягкие ссылки, но по какой-то причине не сортирует файлы
Митч
На Mac похоже, что вторую команду можно сократить до ls -1r.
Эш Райан Арнвин, 01
4
@BBK sort -V отсортирует по номерам версий, поэтому вы получите .. 2.10.2; 2.10.15; .. from man sort .. --sort = WORD будет сортировать по WORD: общее-числовое -g, человеческое-числовое -h, месяц -M, числовое -n, ​​случайное -R, версия -V
mosh
35

lsfrom по умолчанию coreutilsвыполняет сортировку с учетом локали и, таким образом, в некоторых случаях может давать неожиданные результаты (например, %fooсортировка между barи quuxвнутри LANG=en_US). Если вам нужна сортировка ASCIIbetical, используйте

LANG=C ls
Ричард Смит
источник
LANGИллюстрируя поведение сортировки, этот пост мне очень помог!
yurenchen
Это сработало и для меня. не могли бы вы подробнее рассказать об этом? Почему сортировка по-другому?
Костас
1
Эта доза работает, но выводится ?для каждого символа, отличного от ascii, когда вывод является терминалом (плохая функция от ls проверяет, выводится ли он на терминал, работает при конвейере). Вы можете «исправить» это с помощью piping to cat, использовать C.UTF-8локаль (если ваша система поддерживает это) и / или использовать -bфлаг. Еще лучше, не использовать lsвообще, лучше использовать `
12431234123412341234123 05
Это помогло мне обнаружить, что для меня проблема заключалась в том, что некоторые из моих имен файлов содержали дефис (-), а некоторые - короткое тире (-). lsсортирует дефис перед дефисом.
Джейми Махабьер,
17

Прелесть инструментов * nix в том, что их можно комбинировать:

ls -l | sort -k9,9

Результат ls -lбудет выглядеть так

-rw-rw-r-- 1 luckydonald luckydonald  532 Feb 21  2017 Makefile
-rwxrwxrwx 1 luckydonald luckydonald 4096 Nov 17 23:47 file.txt

Итак, 9,9вы сортируете столбец 9до столбца 9, являющегося именами файлов. Вы должны указать, где остановиться, в данном случае это тот же столбец. Столбцы начинаются с 1.

Кроме того, если вы хотите игнорировать верхний / нижний регистр, добавьте --ignore-caseв команду сортировки.

user491575
источник
1
Что -k9,9значит?
luckydonald
Обнаружил, значит отсортировать столбец 9до такого же столбца 9. Нормальный lsвывод выглядит так:, drwx------ 8 999 user 4.0K Feb 5 2017 file.txtпоэтому в столбце 9 указаны имена файлов. Если вы хотите игнорировать регистр, используйте --ignore-caseпри сортировке.
luckydonald
8

ВНИМАНИЕ: "a" идет ПОСЛЕ "Z":

$ touch A.txt aa.txt Z.txt

$ ls

A.txt Z.txt aa.txt

russian_spy
источник
3
Это не всегда верно. Я точно не знаю обстоятельств, которые делают это неверным, но на моей машине с Ubuntu 12.04 вывод ls сортируется в алфавитном порядке (без учета регистра).
Патрик Джеймс Макдугл,
Хороший улов! Похоже, он упорядочивает это на основе кода ASCII .. За алфавитами верхнего регистра следует нижний регистр ..
Кент Павар
1
Я заметил, что моя MacOS сортирует сначала цифры, затем прописные буквы, затем подчеркивание, а затем строчные буквы. Забавно, что они не чувствительны к регистру. С другой стороны, мой Debian чувствителен к регистру, но сортирует буквы нечувствительно, если нет равных, тогда побеждает строчная буква! Пример: ABA.txt ABb.txt aBC.txt AbC.txt ABc.txt
zk82
Я тоже на MAC. Я был разочарован, увидев сортировку A, Z, a, z. Я здесь, потому что предпочитаю иметь А, А, Я, А. спасибо за совет. попробую normalрешения здесь.
nyxee
8

Файлы, отличающиеся только числовой строкой, могут быть отсортированы по этому номеру при условии, что ему предшествует разделитель.

В этом случае можно использовать следующий синтаксис:

ls -x1 file | sort -t'<char>' -n -k2

Пример:

ls -1 TRA*log | sort -t'_' -n -k2

TRACE_1.log
TRACE_2.log
TRACE_3.log
TRACE_4.log
TRACE_5.log
TRACE_6.log
TRACE_7.log
TRACE_8.log
TRACE_9.log
TRACE_10.log
Poney
источник
4

На странице руководства (для bash ls):

Сортировать записи в алфавитном порядке, если нет ни -cftuSUX, ни --sort.

jwoolard
источник
3
Нет никакого "bash ls". Do "which ls"
Норберт Хартл
@Norbert: Вы правы, но which lsвсе получилось бы, даже если бы в bash была встроенная ls. Скорее сделайте builtin lsв bash и получите ошибку.
Pianosaurus
4
@Norbert: whichвсегда возвращает путь. Используется type lsдля определения того, что думает оболочка ls(встроенная, функция, исполняемый файл).
ephemient
3

lsУтилита должна соответствовать IEEE Std 1003.1-2001 ( POSIX.1) , который гласит:

22027: он должен сортировать операнды каталога и не каталоги отдельно в соответствии с последовательностью сортировки в текущей локали.

26027: По умолчанию формат не указан, но вывод должен быть отсортирован в алфавитном порядке по имени символа:

  • Имя библиотеки или объекта, если указано -A
  • Название символа
  • Тип символа
  • Значение символа
  • Размер, связанный с символом, если применимо.
kenorb
источник
2

Проверьте свой .bashrcфайл на псевдонимы.

Sujit
источник
7
Можно просто ввести, aliasчтобы проверить все текущие псевдонимы.
Кшиштоф Яблоньски
2

ls -X подходит для этой цели, если вы установили псевдоним ls на более полезное значение по умолчанию.

jezzo
источник
0
In Debian Jessie, this works nice:

ls -lah --group-directories-first

# l=use a long listing format
# a=do not ignore entries starting with .
# h=human readable
# --group-directories-first=(obvious)
# Note: add -r for reverse alpha

# You might consider using lh by appending to ~/.bashrc as the alias:
~$ echo "alias lh='ls -lah --group-directories-first'" >>~/.bashrc
# -- restart your terminal before using lh command --
Джеймс Т
источник