Como usar ls para agrupar links simbólicos de diretório com outros diretórios?

6

ls --group-directories-first exibe todos os diretórios antes dos arquivos, mas se houver um link simbólico para um diretório, ele será exibido entre os arquivos. Existe uma maneira de agrupar links simbólicos de diretório com outros diretórios regulares?

    
por Martin Heralecký 20.12.2017 / 12:09

2 respostas

4

Considere usar -L . Por exemplo:

$ 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
    
por 20.12.2017 / 13:53
3

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.

    
por 20.12.2017 / 14:39