ls -l --group-directories-first(也对符号链接起作用)

Mar*_*ter 10 ls bash zsh directory symlink

ls选项--group-directories-first导致目录列在顶部,这使得输出ls漂亮和干净:

ls -l --group-directories-first
Run Code Online (Sandbox Code Playgroud)

但是,它不会作用于symlinks实际上symlinks是目录的 。有可能使用

ls -l -L --group-directories-first
Run Code Online (Sandbox Code Playgroud)

它将在顶部列出这两种目录,但不会区分正确的目录和符号链接的目录,这再次令人困惑。

可以ls在顶部显示符号链接目录,同时仍然使它们与常规目录不同吗?

编辑: 我正在使用bash.

Sté*_*las 6

不,但如果使用zsh,你可以这样做:

mll() {
  (($#)) || set -- *(N-/) *(N^-/)
  (($#)) && ls -ldU -- $@
}
Run Code Online (Sandbox Code Playgroud)

您还可以定义一个 globbing 排序顺序,如:

dir1st() { [[ -d $REPLY ]] && REPLY=1-$REPLY || REPLY=2-$REPLY;}
Run Code Online (Sandbox Code Playgroud)

并使用它:

ls -ldU -- *(o+dir1st)
Run Code Online (Sandbox Code Playgroud)

这样的话,你可以用它比其他命令lsls使用不同的选项,或针对不同的模式,如:

ls -ldU -- .*(o+dir1st) # to list the hidden files and dirs
Run Code Online (Sandbox Code Playgroud)

或者:

ls -ldU -- ^*[[:lower:]]*(o+dir1st) # to list the all-uppercase files and dirs
Run Code Online (Sandbox Code Playgroud)

如果必须使用bash,则等效于:

mll() (
  if (($# == 0)); then
    dirs=() others=()
    shopt -s nullglob
    for f in *; do
      if [[ -d $f ]]; then
        dirs+=("$f")
      else
        others+=("$f")
      fi
    done
    set -- "${dirs[@]}" "${others[@]}"
  fi
  (($#)) && exec ls -ldU -- "$@"
)
Run Code Online (Sandbox Code Playgroud)

bash没有 globbing 限定符或任何影响 glob 排序顺序的方法,或任何基于每个 glob 转换 nullglob 的方法,或具有选项的本地上下文(除了启动子外壳,因此()而不是{}上面的)AFAIK .