有没有办法让 ls 首先显示所有点文件,包括隐藏目录,然后是常规目录,然后是常规文件?我已阅读了整个 ls 手册页,但一无所获。我也搜索了超级用户,虽然有一些针对不同问题的答案,例如先显示隐藏文件还是先显示目录,但我没有找到完全符合此顺序的内容。谢谢
答案1
我要回答我自己的问题。经过更多研究,我找到了一种方法来获得我想要的东西。
虽然不是我最初想要的确切顺序,但我找到了一种方法来执行此操作:所有目录(包括隐藏文件),然后是所有点文件,然后是所有常规文件。在 .bashrc 中使用此:别名 d='LC_COLLATE=C ls -la --group-directories-first'。我对此很满意。
答案2
最简单的答案是将其拆分为两个命令:最好在脚本中完成(例如lssort
),但如果您希望ls
始终以这种方式工作,您可以alias ls=lssort
:-
ls -d --group-directories-first "$@"/.*
ls -d --group-directories-first "$@"/*
这假设给出了一个目录名称(可能包含空格),并且它是传递的最后一个参数。不幸的是,这有两个限制:-
- 必须给出目录:为了解决这个问题,您需要扫描参数以找到最后一个参数,如果最后一个参数是一个选项或者不存在,则进行不同的调用(
/
在上面的调用中用空格替换)。 - 如果
ls
选项导致输出总计行(例如-l
),那么您将获得两个总计,每个调用一个。
第一个问题可以通过脚本来回答:-
[ $# == 0 ] && lp='' || eval lp="\${$#}"
[ "${lp#-}" == "$lp" ] && sl=/ || sl=' '
ls -d --group-directories-first "$@"$sl.*
ls -d --group-directories-first "$@"$sl*
第二种方法要求在单个命令中列出所有文件,并将输出重定向到临时文件,并进行一系列grep
搜索,首先搜索^total [0-9]*$
,然后搜索以 开头的文件.
,然后使用 进行相同的搜索以-v
列出其余文件。因此,如果生成的文件名为空,则很容易ls
,但在一般情况下则要复杂得多,超出了本答案的范围。
笔记:-
ls -d
是为了避免子目录的扩展。... && ... || ...
是 的更紧凑形式if ...; then ...; else ...; fi
。eval
需要bash
两次解析命令行:${$#}
会出现错误。