По умолчанию команда ls сортирует только по имени файла, но я хочу, чтобы каталоги появлялись раньше других типов файлов. Я мог бы даже хотеть, чтобы файлы сортировались по расширению, например, как проводник Windows сортирует по столбцу типа. Есть ли способ сделать что-то похожее с ls?
8 ответов
Я думаю, что полный ответ является скорее комбинацией вышеупомянутого.
-X (later --sort=extension)
поддерживается в Linux, по крайней мере, с FC3 и будет сортировать по расширению. --group-directories-first
был добавлен совсем недавно (может быть, около FC8?). Тем не менее, объединение двух не похоже на работу (по крайней мере, на FC8).
Основная проблема, кажется, связана с использованием единичных первичных ключей сортировки. Посмотрите это обсуждение списка рассылки для некоторого понимания этого.
В Linux
$ ls --group-directories-first
(man ls
твой друг!)
-X - это вариант, который вы ищете:
ls -lX
На 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. вот так:
- как это:
- каждая строка перевернута
- тогда они отсортированы
- и снова повернул вспять
- 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~
Если вы не на 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, GNU ls
поддерживает параметр --sort
:-
ls --sort=extension
Хорошим подходом является сначала разделение папок, а затем сортировка файлов по расширениям путем сортировки и обратного вывода:
ls -p | grep /;ls -p | grep -v / | rev | sort | rev
Я добавил в мой .bashrc (linux) строку
alias lx = "ls -X"
таким образом я просто набираю lx и сортирую его по расширению.