如何使ls按文件扩展名排序然后命名?


44

默认情况下,ls命令仅按文件名排序,但我希望目录出现在其他文件类型之前。我什至可能希望文件按扩展名排序,例如Windows资源管理器按类型列排序的方式。有没有办法做与ls类似的事情?

Answers:


42

我认为完整的答案更多是以上两种方法的结合。

-X (later --sort=extension)至少从FC3开始在Linux中受支持,并将基于扩展名进行排序。--group-directories-first是最近才添加的(也许是在FC8附近?)。但是,将两者结合似乎并不起作用(至少在FC8上如此)。

主要问题似乎在于使用单数主排序键。有关此内容的一些见解,请参阅此邮件列表讨论


5
我知道这篇文章比较老,但是对于其他来自Google的人(就像我一样):--sort=extension--group-directories-first(或only --group-directories)的组合对我来说在Ubuntu 12.10上很好用。值得一试的机器!=)
Tomas Aschan

是的-X / --sort=extension--group-directories-first与我在现代Linux发行版上尝试过的其他任何东西结合在一起都没有问题。OP指的是Fedora Core 8(2007年发布),因此很可能在不久的将来出现任何此类问题。
20:42



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 | rev | sort | rev
 cslu1
 ls.mp2
 ls.mp3
 ls.mp4
 trees_110214-15
 拍
 加利福尼亚州立大学
 代理表格.doc
 Finannbyid
 毒死by
 101209ssi.txt.save
 to_annotate_size
 Matas每周整合时间2.rtf
 cyp3.rtf
 data-dir-scan.perl.doc.rtf
 whence-r21-numid.rtf
 鸭嘴兽
 屏幕截图2011年1月21日于2.17.50 PM.png
 emacs打印help.png
 日志
 new_month_log
 特别
 Google-ngram-critique.html
 perl_path.html
 nl
 DWE_BEN_89808.2.ann
 富
 杜富
 100811_from_iMac_Documents_in_dock.zip
 to-palikir.zip
 tmp
 文件清理
 酒吧
 数据扫描文档
 cmp-mg-ann-numids
 finish_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
 finish_ann_numids_110407_1714.txt
 finish_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
 do-mail.txt
 safextn.txt
 mg3longhdr.txt
 finish_numids.txt
 41692-langnames.txt
 TimeAnnotationGuidelines.txt
 41langs.txt
 something4-homedir-links.txt
 bnlinks.txt
 grants.txt
 mata-file-reports.txt
 logx.txt
 日志
 b9-workspace-anndiff.txt〜
 bnlinks.txt〜 

1
不过,不会先列出目录。
CarlF 2011年

如果您愿意的话,它将ls -F
glenn jackman 2011年

+1的努力...
varun

@glennjackman更好。应该是答案。
声音

如果将-F其通过管道输送revsort并且未去除颜色(-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打开,则将删除颜色。
eykanal 2011年

1
带有空格的文件名将给出错误的结果。
glenn jackman 2011年

@glenn,你是对的。如果这是一个问题,我可能会取代一些awk的类似sed -E -e 's/([^ ]+[ ]+){8}//'剥离出来的头8个字段不是打印9日
扎克·汤普森

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


0

一个好的方法是先分离文件夹,然后再按扩展名排序文件,方法是进行排序和反转:

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.