Eu não acho que isso seja possível sem -L
(que fornece informações sobre o destino do link simbólico em vez do link simbólico).
você sempre pode executar invocações two
ls, uma para os diretórios, uma para os não diretórios. Com 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
}
Isso é apenas para ls -l
no diretório atual, precisaria ser adaptado para listar outros arquivos / diretórios.
O alinhamento da coluna também deve ficar quebrado:
$ 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
Outra opção seria usar -qF
e classificar as linhas que terminam em /
primeiro (assume o GNU ls
, pois nem todas as implementações ls
colocarão /
lá para links simbólicos nos diretórios e sort
implementação que suporta -s
como GNU sort
, mas seu --group-directories-first
já é específico do GNU):
lsdirfirst() {
ls -qF "$@" |
awk '{if(/^total [0-9]+$/ || /\/$/) n=1; else n=2; print n, $0}' |
sort -sk1,1 | cut -d' ' -f2-
}
Exemplo:
$ 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
Note que com zsh
, você pode dizer ao seu sistema de conclusão para listar os diretórios primeiro com:
zstyle ':completion:*' list-dirs-first true
E ele coloca links simbólicos em diretórios na categoria diretório :
$ ls Tab
Completing directory
c/ d@
Completing files
a b
(com cores e as descrições Concluindo ... , se ativadas com mais zstyle
s)
Você pode ativar esse estilo de conclusão com base em um comando básico alterando o comando zstyle
para:
zstyle ':completion:*:*:(ls|echo):*:*' list-dirs-first true
por exemplo, para ativá-lo somente para os comandos ls
e echo
.
Veja um exemplo da configuração ~/.zshrc
para obter essa saída na cor acima.
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
Veja também a função compinstall
para uma interface baseada em menus para configurar a conclusão do zsh.