
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 awk
em vez de head
para 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 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á causando awk
o 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, $0
ele 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 $0
contra 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 awk
extrato.
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 é awk
o comportamento padrão de qualquer maneira:
find -type f -size +10M -exec ls -gGsSh1 {} + | awk 'NR<=10'
Alternativamente, você pode continuar usando head
e descartar a mensagem de erro:
find -type f -size +10M -exec ls -gGsSh1 {} + 2>&1 | head