Como estender o comando ls por uma coluna personalizada

1

Gostaria de saber se é possível modificar o comando ls -l por uma coluna personalizada.

Por exemplo, gostaria que essa coluna contivesse, para cada arquivo, a primeira linha de $(CustomCommand FILE) .

    
por flonk 22.09.2015 / 19:44

2 respostas

2

Aqui está uma prova básica de conceito. Não é particularmente robusto (nomes de arquivos com espaços irão quebrá-lo, por exemplo), mas faz a ideia passar.

$ export CustomCommand=file
$ alias ls=/tmp/test/myls
$ ls
a  b  c  myls
$ ls -l
-rw-rw-r-- 1 steve steve   0 Sep 22 19:17 a a: empty
-rw-rw-r-- 1 steve steve   0 Sep 22 19:17 b b: empty
-rw-rw-r-- 1 steve steve   0 Sep 22 19:17 c c: empty
-rwxr-xr-x 1 steve steve 127 Sep 22 19:18 myls myls: POSIX shell script,     ASCII text executable
$ cat /tmp/test/myls
#!/bin/sh
if [ "$1" = "-l" ]
then
 shift
 ls -l $* | awk 'NF>2{ printf "%s ",$0 ; system("$CustomCommand " $NF) }'
else
 ls $*
fi
$
    
por 22.09.2015 / 20:21
0

Aqui está uma abordagem juntando colar, sed, ls e salvando-a no bashrc. Tem duas partes principais:

  • um "custom_command" aqui que leva argumentos, mas apenas prefixos a cada argumento passado para ele, com "YYY" e acrescenta "ZZZ", o CustomCommand real do OP faria naturalmente algo diferente
  • um alias chamado "ls1" que inclui chamar custom_command. Chamado de "ls1" para evitar conflito com "ls" porque ainda dependemos de "ls"

Então, no seu ~ / .bashrc, adicione:

custom_command ()
{
    for i; do
        echo "YYY${i}ZZZ"
    done
}

alias ls1='paste <( ls -lh | sed 1d ) <( custom_command * )'

E, em seguida, . ~/.bashrc para torná-lo efetivo no terminal atual.

Se o diretório atual contiver 'dir1' 'file1' 'file2' e 'file 3' (para testar um arquivo com espaços), você pode executar o alias ls1 e ver:

$ ls1
drwxr-xr-x 2 meme meme 4.0K Sep 22 14:33 dir1   YYYdir1ZZZ
-rw-r--r-- 1 meme meme    8 Sep 22 13:51 file1  YYYfile1ZZZ
-rw-r--r-- 1 meme meme    8 Sep 22 13:51 file2  YYYfile2ZZZ
-rw-r--r-- 1 meme meme   14 Sep 22 15:45 file 3 YYYfile 3ZZZ

Explicação

custom_command ()
{
    for i; do
        echo "YYY${i}ZZZ"
    done
}
  • O for i sem especificar mais nada fará com que o loop use os parâmetros posicionais
  • as chaves são necessárias para distinguir a variável i, caso contrário o bash interpretará erroneamente $ iZZZ como uma variável

Exemplo de saída:

$ custom_command a b c
YYYaZZZ
YYYbZZZ
YYYcZZZ

Quando usado com a expansão * bash:

$ custom_command *
YYYdir1ZZZ
YYYfile1ZZZ
YYYfile2ZZZ
YYYfile 3ZZZ

O "ls -lh" normalmente fará isso:

$ ls -lh
total 16K
drwxr-xr-x 2 meme meme 4.0K Sep 22 14:33 dir1
-rw-r--r-- 1 meme meme    8 Sep 22 13:51 file1
-rw-r--r-- 1 meme meme    8 Sep 22 13:51 file2
-rw-r--r-- 1 meme meme   14 Sep 22 15:45 file 3

Usando sed, 1 significa linha 1, d para excluir, para remover a primeira linha:

$ ls -lh | sed 1d
drwxr-xr-x 2 meme meme 4.0K Sep 22 14:33 dir1
-rw-r--r-- 1 meme meme    8 Sep 22 13:51 file1
-rw-r--r-- 1 meme meme    8 Sep 22 13:51 file2
-rw-r--r-- 1 meme meme   14 Sep 22 15:45 file 3

O programa paste e a% de <(...) de processo são a chave para combinar essas saídas separadas. Colar normalmente espera arquivos como argumentos, por exemplo, paste data1 data2 . Usamos a substituição de processos do bash para que a saída de comandos apareça para colar como arquivos comuns com os quais ele pode trabalhar, assim:

$ paste <( ls -lh | sed 1d ) <( custom_command * )
drwxr-xr-x 2 meme meme 4.0K Sep 22 14:33 dir1   YYYdir1ZZZ
-rw-r--r-- 1 meme meme    8 Sep 22 13:51 file1  YYYfile1ZZZ
-rw-r--r-- 1 meme meme    8 Sep 22 13:51 file2  YYYfile2ZZZ
-rw-r--r-- 1 meme meme   14 Sep 22 15:45 file 3 YYYfile 3ZZZ

O uso do bashrc meramente salva este comando para reutilização conveniente em novos terminais, ou terminais existentes onde você executa . ~/.bashrc para recarregar o bash.

    
por 22.09.2015 / 22:39

Tags