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


9

ls选项--group-directories-first导致目录在顶部列出,这使输出的内容更加ls简洁:

ls -l --group-directories-first

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

ls -l -L --group-directories-first

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

可以ls在顶部显示符号链接目录,同时仍使其与常规目录区分开吗?

编辑: 我正在使用bash


这是的特质行为ls。根据stat()系统调用,指向目录的符号链接仍然是目录(S_ISDIR(st_mode)将返回true)。Evidentially ls打折符号链接 之前它会检查这个。
goldilocks 2014年

2
@goldilocks,不,lslstat()(和readlink对符号连接),除非你使用的-L选项(在这种情况下使用stat()
斯特凡Chazelas

@StephaneChazelas:嗯,生活和学习。我原以为S_ISLNK(st_mode)通过via也返回true stat(),但事实并非如此,它只是通过via才返回lstat()。同样,即使链接是指向链接的链接,ISLNK也不会通过stat返回true。这意味着ISLNK可能永远不会通过stat返回true,尽管这是未指定的……
goldilocks 2014年

@goldilocks,stat在符号链接末尾为您提供文件的属性。如果不存在或无法访问,则stat返回ENOENT,因此返回的值stat永远不会是符号链接。stat()永远不会告诉您有关符号链接的任何信息,就像open永远不会打开符号链接,或chmod()不会更改符号链接的权限...等等。
StéphaneChazelas 2014年

Answers:


5

不,但是如果使用zsh,则可以执行以下操作:

mll() {
  (($#)) || set -- *(N-/) *(N^-/)
  (($#)) && ls -ldU -- $@
}

您还可以定义如下的全局排序顺序:

dir1st() { [[ -d $REPLY ]] && REPLY=1-$REPLY || REPLY=2-$REPLY;}

并像这样使用它:

ls -ldU -- *(o+dir1st)

这样,您可以将其用于其他命令,而不是使用其他选项或与其他选项ls一起ls使用,或用于其他模式,例如:

ls -ldU -- .*(o+dir1st) # to list the hidden files and dirs

要么:

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

如果必须使用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 -- "$@"
)

bash没有全局限定符或任何方法来影响全局排序的顺序,也没有任何方法可以在每个全局基础上打开nullglob,也没有用于选项的局部上下文(除了启动子shell外,因此()不是{}上面的替代) 。


1
有什么类似的把戏bash吗?
Martin Vegter 2014年
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.