如何让 ls 按顺序显示隐藏文件、目录和常规文件

如何让 ls 按顺序显示隐藏文件、目录和常规文件

有没有办法让 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 "$@"/*

这假设给出了一个目录名称(可能包含空格),并且它是传递的最后一个参数。不幸的是,这有两个限制:-

  1. 必须给出目录:为了解决这个问题,您需要扫描参数以找到最后一个参数,如果最后一个参数是一个选项或者不存在,则进行不同的调用(/在上面的调用中用空格替换)。
  2. 如果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两次解析命令行:${$#}会出现错误。

相关内容