Por que esse comando não funciona como um alias?

3

Eu tenho usado o seguinte comando para listar os dez maiores arquivos, em qualquer profundidade, no diretório atual:

find -type f -size +10M -exec ls -gGsSh1 {} + | awk 'NR<=10 {print $0}'

(Eu uso awk em vez de head para evitar um erro de canal quebrado quando a lista é muito longa)

Funciona bem, mas é evidentemente difícil lembrar e digitar todas as vezes. Eu tentei colocar isso em .bash_aliases, mas não funciona (imprime 10 linhas vazias).

Se eu usar less em vez de awk , a saída será apresentada corretamente, mas isso significa mostrar toda a lista de arquivos maiores que 10 MB (meu limite inferior), classificados por tamanho, em vez de apenas os principais.

Então, o que está fazendo awk sufocar como parte de um comando com alias aqui (supondo que esse seja realmente o problema), e o que posso fazer para corrigir isso?

    
por waldyrious 06.05.2013 / 13:35

1 resposta

8

Ao usar este comando como um alias, $0 não é mais protegido pelas aspas simples, portanto, é convertido em seu nome de shell. Estes comandos demonstram isso:

$ alias F="echo '$0'"      
$ F
bash

O nome do shell (presumivelmente bash ) é um nome de variável unset awk

Uma maneira de proteger $0 da expansão do shell seria usar algo como:

alias F="find -type f -size +1k -exec ls -gGsSh1 {} + | awk 'NR<=10 {print \
find -type f -size +10M -exec ls -gGsSh1 {} + | awk 'NR<=10 {print}'
}'"

No entanto, como esse $0 é inútil, basta removê-lo da instrução awk .

find -type f -size +10M -exec ls -gGsSh1 {} + | awk 'NR<=10'

Você pode ir mais longe e remover todo o bloco, pois a impressão da linha selecionada é awk , de qualquer maneira:

find -type f -size +10M -exec ls -gGsSh1 {} + 2>&1 | head

Como alternativa, você pode continuar usando head e descartar a mensagem de erro:

$ alias F="echo '$0'"      
$ F
bash
    
por jlliagre 06.05.2013 / 13:51