Як зробити сортування ls за розширенням файлу, а потім ім'ям?


44

За замовчуванням команда ls сортує саме за назвою файлу, але я хочу, щоб каталоги відображалися перед іншими типами файлів. Можливо, я навіть хочу, щоб файли були відсортовані за розширенням, як, наприклад, програма Windows Explorer сортує за стовпцем типу. Чи є спосіб зробити щось подібне з ls?

Відповіді:


42

Я думаю, що повна відповідь - це більше поєднання сказаного.

-X (later --sort=extension)підтримується в Linux, щонайменше, від FC3 і сортуватиметься за розширенням. --group-directories-firstдодано нещодавно (можливо, навколо FC8?). Однак, поєднувати ці два, здається, не вийде (принаймні, на FC8).

Основна проблема, здається, полягає у використанні сингулярних клавіш первинного сортування. Дивіться цю дискусію зі списку розсилки, щоб ознайомитися з нею


5
Я знаю, що ця публікація досить стара, але для інших, які приходять сюди, наприклад, від Google (як я): комбінація --sort=extensionта --group-directories-first(або лише --group-directories) мені добре працює на Ubuntu 12.10. Варто пострілу і на вашій машині! =)
Томаш Ашан

Так, ніяких проблем із поєднанням -X / --sort=extensionіз --group-directories-firstусім іншим, що я спробував у сучасних дистрибутивах Linux. ОП посилається на Fedora Core 8 (випущений 2007 р.), Тому є ймовірність виникнення таких проблем у далекому минулому.
матст

23

У Linux,

$ ls --group-directories-first

( man lsце твій друг!)


1
схвалено В SPITE коментаря rtfm.
Шрідхар Сарнобат

gls --group-directories-firstна Mac, якщо ви встановите GNU Core utilsна домашній мові
до


13

На баш, це буде така робота:

$ ls | rev | sort | rev

Від man rev:

 The rev utility copies the specified files to the standard output,
 reversing the order of characters in every line.  If no files are speci-
 fied, the standard input is read.

Отже 1. ls дає результат, з будь-якими прапорами, які ви хочете 2. кожен рядок перевертається 3. потім вони сортуються 4. і повертаються знову 5. так:

  1. подобається це:
  2. кожен рядок перевернутий
  3. потім вони сортуються
  4. і знову перевернуто Отже
  5. ls дає результат, з будь-якими прапорами

Або, до речі, як нижче. Вони сортуються за останнім символом, потім - до останнього тощо. Усі файли .rtf, наприклад, перераховані разом, після .save-файлу та іншого файлу без розширення, ім'я якого закінчується на "e". Потім приходять .png файли тощо. Це також буде працювати з ls -l, тому що розширення, як правило, є останнім у рядку (винятки, якщо у вас є рядки типу "tmp @ -> / home / jones / tmp", де посилання слідують за їх цілями).

$ ls | rev | сортувати | rev
 cslu1
 ls.mp2
 ls.mp3
 ls.mp4
 дерева_110214-15
 ПАТ
 CSLU
 Форма проксі.doc
 finannbyid
 toannbyid
 101209ssi.txt.save
 to_annotate_size
 Matas-час-тиждень-інтеграція2.rtf
 cyp3.rtf
 data-dir-scan.perl.doc.rtf
 звідки-r21-numid.rtf
 platypus.rtf
 Знімок екрана 2011-01-21 о 2.17.50 PM.png
 emacs print help.png
 журнал
 new_month_log
 спеціальні
 Google-ngram-critique.html
 perl_path.html
 нл
 DWE_BEN_89808.2.ann
 foo
 дофу
 100811_from_iMac_Documents_in_dock.zip
 to-palikir.zip
 tmp
 очищення файлів
 бар
 Документи сканування даних
 cmp-mg-ann-numids
 готові_нуміди
 to_annotate_numids
 manls.ps
 Mike_address_ticket
 cyp2.out
 cyp3.out
 locate-cyp.out
 manls.out
 DWE_BEN_89808.2.текст
 тег2.txt
 l2.txt
 du-h-d3.txt
 Finish_ann_numids_110407_1714.txt
 Finish_all_numids_110407_1718.txt
 data-dir-scan.perl.doc.txt
 звідки-r21-numid.txt
 finannid.txt
 toannid.txt
 b9-робоча область-anndiff.txt
 tag.txt
 duh.txt
 do-mail.txt
 safextn.txt
 mg3longhdr.txt
 Finish_numids.txt
 41692-langnames.txt
 TimeAnnotationGuidelines.txt
 41langs.txt
 thing4-homedir-links.txt
 bnlinks.txt
 grants.txt
 mata-file-report.txt
 logx.txt
 logx
 b9-робоча область-anndiff.txt ~
 bnlinks.txt ~ 

1
Хоча б спочатку не було вказано каталоги.
CarlF

це буде, якщо виls -F
glenn jackman

+1 за зусилля ...
varun

@glennjackman, що краще. повинно бути у відповіді.
голоси

Було б добре (особливо з -F), якби пропустити його через rev& sortне зняти колір ( -G).
голоси

3

Якщо ви не в Linux,

ls -l |sort -d -k 1.1,1.1r -k 9 |awk '{print $9}'

спочатку слід сортувати каталоги (дайте мені знати, якщо я помиляюся). Хоча це не сортування за розширенням: вам потрібно зробити заяву awk набагато зайнятішою, якщо ви хочете це зробити ...


Щоб також він працював з іменами, що містять пробіли, я, ймовірно, замінюю awk чимось на зразок sed -E -e 's/([^ ]+[ ]+){8}//'викреслити перші 8 полів, а не надрукувати 9-е.


насправді я майже впевнений, що це буде працювати і на Linux, але, як заявили інші, у вас є деяка вбудована підтримка.
Зак Томпсон,

1
Працює на Mac. Зауважте, що якщо ви CLICOLORввімкнули цю функцію, забарвлення буде видалено.
ейканал

1
дасть неправильні результати для імен файлів з пробілами.
glenn jackman

@glenn, ти маєш рацію ... якби це було проблемою, я б, мабуть, замінив awk чимось на зразок sed -E -e 's/([^ ]+[ ]+){8}//'викреслити перші 8 полів замість того, щоб надрукувати 9-е
Зак Томпсон

ls -l |sort -d -k 1.1,1.1r -k 9 | cut -c 50-
nohillside


0

Хорошим підходом є спочатку розділення папок , потім відсортованих файлів за розширеннями , за допомогою SORTING та REVERSING:

ls -p | grep /;ls -p | grep -v / | rev | sort | rev

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