如何使用 ls 将目录符号链接与其他目录分组?

如何使用 ls 将目录符号链接与其他目录分组?

ls --group-directories-first在文件之前显示所有目录,但如果存在指向目录的符号链接,则会在文件之间显示。有没有办法将目录符号链接与其他常规目录分组?

答案1

考虑使用-L.例如:

$ ls -l
total 4
-rw-r--r-- 1 ja users    0 Dec 20 13:23 A
drwxr-xr-x 2 ja users 4096 Dec 20 13:23 b
lrwxrwxrwx 1 ja users    1 Dec 20 13:23 sl -> b
$ ls --group-directories-first -l
total 4
drwxr-xr-x 2 ja users 4096 Dec 20 13:23 b
-rw-r--r-- 1 ja users    0 Dec 20 13:23 A
lrwxrwxrwx 1 ja users    1 Dec 20 13:23 sl -> b
$ ls --group-directories-first -lL
total 8
drwxr-xr-x 2 ja users 4096 Dec 20 13:23 b
drwxr-xr-x 2 ja users 4096 Dec 20 13:23 sl
-rw-r--r-- 1 ja users    0 Dec 20 13:23 A

答案2

-L我认为如果没有(它为您提供有关符号链接而不是符号链接的目标的信息),这是不可能的。

您始终可以运行twols 调用,一个用于目录,一个用于非目录。和zsh

lldirfirst() {
  local -a dir nondir
  local ret=0
  dir=(*(N-/)) nondir=(*(N^-/))
  (($#dir == 0)) || ls -ld -- $dir || ret=$?
  (($#nondir == 0)) || ls -ld -- $nondir || ret=$?
  return $ret
}

这仅适用ls -l于当前目录,需要对其进行调整以列出其他文件/目录。

还要注意列对齐可能会被破坏:

$ lldirfirst
drwxr-xr-x 2 chazelas chazelas 4096 Dec 20 13:20 c
lrwxrwxrwx 1 chazelas chazelas    1 Dec 20 13:20 d -> c
-rw-r--r-- 1 chazelas chazelas 0 Dec 20 13:20 a
-rw-r--r-- 1 chazelas chazelas 0 Dec 20 13:20 b

另一种选择是使用-qF和排序以第一个结尾的行/(假设 GNUls不是所有的ls实现都会/在目录中放置一个符号链接,并且sort支持-s类似 GNU 的实现sort,但无论如何你--group-directories-first已经是 GNU 特定的):

lsdirfirst() {
  ls -qF "$@" |
    awk '{if(/^total [0-9]+$/ || /\/$/) n=1; else n=2; print n, $0}' |
    sort -sk1,1 | cut -d' ' -f2-
}

例子:

$ lsdirfirst -l
total 4
drwxr-xr-x 2 chazelas chazelas 4096 Dec 20 13:20 c/
lrwxrwxrwx 1 chazelas chazelas    1 Dec 20 13:20 d -> c/
-rw-r--r-- 1 chazelas chazelas    0 Dec 20 13:20 a
-rw-r--r-- 1 chazelas chazelas    0 Dec 20 13:20 b

请注意,使用zsh,您可以告诉其完成系统首先列出目录:

zstyle ':completion:*' list-dirs-first true

它确实将符号链接放入目录中目录类别:

$lsTab
正在完成目录
光盘@
完成文件
ab

(有颜色和那些正在完成...描述(如果启用了更多zstyles)

您可以通过将该zstyle命令更改为:

zstyle ':completion:*:*:(ls|echo):*:*' list-dirs-first true

例如仅对lsecho命令启用它。

下面是一个配置示例~/.zshrc,用于获取上面的彩色输出。

eval "$(dircolors -b)"
zstyle ':completion:*' completer _expand _complete _ignored _correct _approximate _prefix
zstyle ':completion:*' format 'Completing %d'
zstyle ':completion:*' group-name ''
zstyle ':completion:*' menu select=2
zstyle ':completion:*' list-colors ${(s.:.)LS_COLORS}
zstyle ':completion:*' list-dirs-first true
autoload -Uz compinit
compinit -i

另请参阅compinstall基于菜单的界面的功能来配置 zsh 完成。

相关内容