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

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

Estou usando 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 awkem vez de headpara evitar umerro de tubo quebradoquando a lista é muito longa)

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

Se eu usar lessem 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á causando awko estrangulamento como parte de um comando com alias aqui (supondo que esse seja realmente o problema) e o que posso fazer para corrigi-lo?

Responder1

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

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

O nome do shell (presumivelmente bash) não está definidoestranhonome da variável, levando às linhas vazias.

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

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

No entanto, como isso $0é inútil, você pode simplesmente removê-lo do awkextrato.

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

Você pode ir mais longe e remover todo o bloco, pois imprimir a linha selecionada é awko comportamento padrão de qualquer maneira:

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

Alternativamente, você pode continuar usando heade descartar a mensagem de erro:

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

informação relacionada