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
我认为如果没有(它为您提供有关符号链接而不是符号链接的目标的信息),这是不可能的。
您始终可以运行two
ls 调用,一个用于目录,一个用于非目录。和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
(有颜色和那些正在完成...描述(如果启用了更多zstyle
s)
您可以通过将该zstyle
命令更改为:
zstyle ':completion:*:*:(ls|echo):*:*' list-dirs-first true
例如仅对ls
和echo
命令启用它。
下面是一个配置示例~/.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 完成。