find / -type f -size +20000k -exec ls -lh {} \; 2> /dev/null | awk '{ print $NF ": " $5 }' | sort -hrk 2,2
-
/
: find começa no diretório principal -
-type f
: encontre apenas arquivos regulares -
-size +20000k
: com tamanho 20000k ou mais -
-exec ls -lh {} \;
: para cada arquivo que foi encontrado executels -lh
, ou seja, liste-os em formato longo e tamanho legível (com o sufixo 'K', 'M', 'G', etc.) -
2>/dev/null
: sefind
gerou alguma mensagem de erro redirecionando-a para o buraco negro -
|
: canaliza o resultadofind
para o próximo comando (awk neste caso) -
awk '{print $NF ": " $5}'
: imprime o último campo (dals -lh
output) seguido por dois pontos e, em seguida, seguido pelo quinto campo. O último campo é o nome do arquivo e o quinto campo é o tamanho do arquivo (em formato legível como mencionado anteriormente). -
|
: novamente canalize o resultado (desta vez deawk
parasort
) -
sort -hrk 2,2
: resultado da classificação por números legíveis por humanos em ordem inversa, considerando apenas o segundo campo.
Nota
Você pode fazer essa tarefa de maneira muito mais simples e rápida sem os comandos awk
e sort
:
find / -type f -size +20000k -exec ls -Shs {} +
onde
-
ls -Shs
: lista arquivos, imprima seus tamanhos em formato legível e, ao mesmo tempo, classifique-os por tamanho -
{} +
adiciona arquivos encontrados porfind
à lista e somente no final executals
na lista inteira. Em{} \;
casels
é executado em cada arquivo separadamente.
A única diferença entre esses dois comandos é que, no caso anterior, o tamanho é impresso na segunda coluna, enquanto no segundo, no primeiro. No entanto, se os arquivos ou diretórios tiverem espaços nos nomes, a saída de ls -l
terá um número diferente de colunas para cada arquivo, portanto, a saída de awk
será mais ou menos aleatória. Em outras palavras, você não deve analisar a saída de ls .