Сортування "ls" Unix за назвою


127

Чи можете ви сортувати ls список за назвою?


10
Якщо це не сортування за назвою без жодних аргументів, ви можете перевірити, чи ls було присвоєно чомусь іншому, або просто викликати його, використовуючи повний шлях, який би усунув будь-які псевдоніми, які існують.
tvanfosson

gnu-coreutils ls сортує за замовчуванням. Яку систему ви використовуєте (як запитували інші)
Nick Fortescue

Ви впевнені, що просите сортувати за назвою, а не за типом (тобто спочатку каталог, а потім файли) ??
curtisk

Великі літери надходять перед малими літерами, таким чином файл Z надходить до файлу ... як я можу це виправити?
ArtOfWarfare

man page говорить "сортується окремо та в лексикографічному порядку". Файли сортуються відповідно до першого символу: числові [0..9] та UPPER символи [A..Z] та низькі символи [a..z]
Gürol Canbek

Відповіді:


131

Моє сортування за назвою за замовчуванням. Що ти бачиш?

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" приходить раніше ". але його все ще не інтуїтивно зрозуміло
chiliNUT

Я бачу "M" перед "b". Плутати. Зачекайте, чи має значення капіталізація?
Даніель Спрінгер

106

Щось просте, ви можете комбінувати ls з сортуванням . Для лише списку імен файлів:
ls -1 | сортувати

Сортувати їх у зворотному порядку:
ls -1 | сортувати -р


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.
Еш Райан Арнвін

4
@BBK сортувати -V буде сортувати за номерами версій, так що ви отримаєте .. 2.10.2; 2.10.15; .. від людини сорт .. --sort = СЛОВО буде сортувати за WORD: загально-числовий -g, людина-числовий -h, місяць -M, числовий -n, випадковий -R, версія -V
mosh

35

lsз за замовчуванням coreutilsвиконує сортування, що знає локальну мову , і, таким чином, може створювати дивовижні результати в деяких випадках (наприклад, %fooбуде сортувати між barі quuxв LANG=en_US). Якщо ви хочете сортувати ASCII, використовуйте

LANG=C ls

LANGякщо я подумаю про подібну поведінку, цей пост мені дуже допомагає!
Юренхен

Це працювало і для мене. Ви могли б детальніше розглянути це? Чому це сортується інакше?
Костас

1
Ця доза працює, але виводиться ?для кожного символу, що не відповідає, коли вихід є термінальним (погана особливість ls перевірити, чи він виводиться на термінал, працювати при трубопроводі). Ви можете "виправити" це за допомогою трубопроводу до кота, скористайтесь C.UTF-8локалом (якщо ваша система його підтримує) та / або використовуйте -bпрапор. Ще краще, не використовуйте lsвзагалі, краще використовуйте `
12431234123412341234123

Це допомогло мені виявити, що для мене проблема полягала в тому, що деякі мої назви файлів містили дефіс (-), а дехто на тире (-). 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до команди сортування.


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


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. Я тут, тому що я вважаю за краще мати A, a, Z, a. дякую за пораду. випробуємо 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

4

На сторінці man (для bash ls):

Сортуйте записи в алфавітному порядку, якщо жодна з -cftuSUX або --sort.


3
Немає "баш лс". Зробіть "котрий лс"
Норберт Хартл

@Norbert: Ви маєте рацію, але which lsдосягли б успіху, навіть якщо баш мав вбудований ls. Швидше, робити builtin lsв баш, і помилитися.
Піанозавр

4
@Norbert: whichзавжди повертає шлях. Використовуйте type lsдля визначення того, що думає оболонка ls(вбудована, функціональна, виконувана).
ефемієнт

3

lsУтиліта має відповідати IEEE Std 1003.1-2001 ( POSIX.1) , який говорить:

22027: вона сортуватиме операнди каталогів та не-каталогів окремо відповідно до послідовності згортання у поточному локалі.

26027: За замовчуванням формат не визначений, але вихід має бути відсортований за алфавітом за назвою символу:

  • Назва бібліотеки чи об'єкта, якщо вказано −A
  • Назва символу
  • Тип символу
  • Значення символу
  • Розмір, пов’язаний із символом, якщо це можливо

2

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


7
Можна просто набрати, aliasщоб перевірити наявність усіх поточних псевдонімів.
Krzysztof Jabłoński

2

ls -X працює для цієї мети, якщо ви віддалили ls до більш корисного за замовчуванням.


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 --
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.