38

По умолчанию команда ls сортирует только по имени файла, но я хочу, чтобы каталоги появлялись раньше других типов файлов. Я мог бы даже хотеть, чтобы файлы сортировались по расширению, например, как проводник Windows сортирует по столбцу типа. Есть ли способ сделать что-то похожее с ls?

8 ответов8

37

Я думаю, что полный ответ является скорее комбинацией вышеупомянутого.

-X (later --sort=extension) поддерживается в Linux, по крайней мере, с FC3 и будет сортировать по расширению. --group-directories-first был добавлен совсем недавно (может быть, около FC8?). Тем не менее, объединение двух не похоже на работу (по крайней мере, на FC8).

Основная проблема, кажется, связана с использованием единичных первичных ключей сортировки. Посмотрите это обсуждение списка рассылки для некоторого понимания этого.

20

В Linux

$ ls --group-directories-first

(man ls твой друг!)

13

-X - это вариант, который вы ищете:

ls -lX
11

На 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 | rev|sort|rev
 cslu1
 ls.mp2
 ls.mp3
 ls.mp4
 trees_110214-15
 PAT
 CSLU
 Proxy Form.doc
 finannbyid
 toannbyid
 101209ssi.txt.save
 to_annotate_size
 Matas-time-by-week-integration2.rtf
 cyp3.rtf
 data-dir-scan.perl.doc.rtf
 whence-r21-numid.rtf
 platypus.rtf
 Screen shot 2011-01-21 at 2.17.50 PM.png
 emacs print help.png
 log
 new_month_log
 special
 Google-ngram-critique.html
 perl_path.html
 nl
 DWE_BEN_89808.2.ann
 foo
 d.o.foo
 100811_from_iMac_Documents_in_dock.zip
 to-palikir.zip
 tmp
 file-cleanup
 bar
 data-scan-docs
 cmp-mg-ann-numids
 finished_numids
 to_annotate_numids
 manls.ps
 Mike_address_ticket
 cyp2.out
 cyp3.out
 locate-cyp.out
 manls.out
 DWE_BEN_89808.2.text
 tag2.txt
 l2.txt
 du-h-d3.txt
 finished_ann_numids_110407_1714.txt
 finished_all_numids_110407_1718.txt
 data-dir-scan.perl.doc.txt
 whence-r21-numid.txt
 finannid.txt
 toannid.txt
 b9-workspace-anndiff.txt
 tag.txt
 duh.txt
 d.o-mail.txt
 safextn.txt
 mg3longhdr.txt
 finished_numids.txt
 41692-langnames.txt
 TimeAnnotationGuidelines.txt
 41langs.txt
 thing4-homedir-links.txt
 bnlinks.txt
 grants.txt
 mata-file-reports.txt
 logx.txt
 logx
 b9-workspace-anndiff.txt~
 bnlinks.txt~ 
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

2

Если вы работаете в Linux, GNU ls поддерживает параметр --sort :-

ls --sort=extension
0

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

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

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

alias lx = "ls -X"

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .