Как сделать сортировку ls по расширению и имени?


44

По умолчанию команда ls сортирует только по имени файла, но я хочу, чтобы каталоги появлялись раньше других типов файлов. Я мог бы даже хотеть, чтобы файлы сортировались по расширению, например, как проводник Windows сортирует по столбцу типа. Есть ли способ сделать что-то похожее с 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. OP ссылается на Fedora Core 8 (выпущена в 2007 году), поэтому есть вероятность, что такие проблемы в далеком прошлом.
Мэттст



13

На bash это будет работать:

$ 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 | обороты | сортировать | оборот
 cslu1
 ls.mp2
 ls.mp3
 ls.mp4
 trees_110214-15
 PAT
 CSLU
 Proxy Form.doc
 finannbyid
 toannbyid
 101209ssi.txt.save
 to_annotate_size
 Матас-время по-недельного integration2.rtf
 cyp3.rtf
 Данные-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
 dofoo
 100811_from_iMac_Documents_in_dock.zip
 to-palikir.zip
 TMP
 файл-очистка
 бар
 данные-сканирования-документы
 ЦМФ-мг-Анн-numids
 finished_numids
 to_annotate_numids
 manls.ps
 Mike_address_ticket
 cyp2.out
 cyp3.out
 местонахождение-cyp.out
 manls.out
 DWE_BEN_89808.2.text
 tag2.txt
 l2.txt
 дю-ч-d3.txt
 finished_ann_numids_110407_1714.txt
 finished_all_numids_110407_1718.txt
 Данные-Dir-scan.perl.doc.txt
 откуда-r21-numid.txt
 finannid.txt
 toannid.txt
 b9-рабочее пространство-anndiff.txt
 TAG.txt
 duh.txt
 делать-mail.txt
 safextn.txt
 mg3longhdr.txt
 finished_numids.txt
 41692-langnames.txt
 TimeAnnotationGuidelines.txt
 41langs.txt
 thing4-HomeDir-links.txt
 bnlinks.txt
 grants.txt
 Мат-файл-reports.txt
 logx.txt
 logx
 b9-рабочее пространство-anndiff.txt ~
 bnlinks.txt ~ 

1
Впрочем, сначала не стоит перечислять каталоги.
CarlF

это будет, если выls -F
Гленн Джекман

+1 за усилие ...
Варун

@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, вы правы ... если бы это было проблемой, я бы, вероятно, заменил бы awk чем-то вроде вырезания sed -E -e 's/([^ ]+[ ]+){8}//'первых 8 полей вместо печати 9-го
Zac Thompson

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


0

Хорошим подходом является сначала разделение папок , а затем сортировка файлов по расширениям путем сортировки и обратного вывода:

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

-1

Я добавил в мой .bashrc (linux) строку

alias lx = "ls -X"

таким образом я просто набираю lx и сортирую его по расширению.


Так что ответом на вопрос является использование ls -X:)
Андрей

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