我想列出一堆按名称排序的文件(不包括文件扩展名)。我将这些文件放在一个目录中
$ls
mobility_arXiv.tex
mobility_SR.bbl
paper-hj-mm.tex
paper-hj-mm-vp-rkp.tex
paper-hj.tex
我希望输出是
mobility_arXiv.tex
mobility_SR.bbl
paper-hj.tex
paper-hj-mm.tex
paper-hj-mm-vp-rkp.tex
有没有办法实现这一点。
答案1
您可以将 的输出通过管道传输ls
到 中cut
,这会剪切字段,并指定“.”作为分隔符。然后可以通过将 的输出通过管道传输到 中对结果进行排序sort
。
ls | cut -f 1 -d '.' | sort
如果你需要处理文件名中的点“。”,你可以使用
ls | rev | cut -d . -f 2- | rev | sort
其工作原理是,首先反转 ls 返回的每个列表,然后切掉第一个(最初是最后一个)字段,然后再次反转。
注:不能用于彩色输出
如果你仍然想保留扩展名,并且只按文件名的第一部分排序,则可以使用
ls | sort -k 1,1 -t .
这里您告诉 sort 使用“。”作为分隔符并根据键(字段)1 进行排序。
答案2
这ls命令按以下方式对文件进行排序文件名默认情况下按字母顺序升序排列。扩展名是文件名的一部分,因此,如果您不需要输出中的扩展名,那么最好的方法是:
ls | cut -f 1 -d '.' | sort
更新
更好的解决方案:
ls | sort -k 1,1 -t .
这里 sort 被要求只使用字段编号 1 和点作为字段分隔符。因此它忽略了扩展名,但并没有将其删除。