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: sefindgerou alguma mensagem de erro redirecionando-a para o buraco negro -
|: canaliza o resultadofindpara o próximo comando (awk neste caso) -
awk '{print $NF ": " $5}': imprime o último campo (dals -lhoutput) 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 deawkparasort) -
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 executalsna 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 .