Estou enfrentando problemas para entender o significado deste comando do Linux:
du -sk * | sort -rn | head
Eu entendo que du é usado para exibir o uso do disco, mas estou enfrentando problemas para entender o restante do comando. Alguém pode por favor detalhar o que exatamente está acontecendo aqui? Além disso, alguns bons recursos podem ser sugeridos para estudar em detalhes comandos complexos do linux?
Ele está usando a construção de pipe, que permite que a saída de um comando alimente como entrada o comando a seguir.
inicia 3 comandos
Que executa a saída do comando disk use
du
em kilobytes (-k
), incluindo subdiretórios, saída apenas um subtotal (-s
) é enviado como entrada paraQue irá classificar, tratando cada chave de linha como numérica, em ordem inversa (decrescente), a saída é enviada para o próximo comando.
que como padrão produzirá apenas as primeiras 10 linhas.
a | b | c
executaa
e simultaneamenteb
emc
processos separados com o stdout de um comando conectado ao stdin do próximo por meio de um pipe.Aqui,
a
édu -sk *
.*
é expandido pelo shell para os nomes dos arquivos não ocultos no diretório atual classificados lexicamente (e se não houver arquivos não ocultos, aborte o comando com um erro ou expanda para um literal*
dependendo do shell).Aqui, se algum dos arquivos tivesse um nome começando com
-
, isso seria tratado como uma opção pordu
, então a sintaxe correta seria:du -sk -- *
,--
certificando-se de que qualquer coisa além dele não seja tratada como uma opção.-k
é obter os usos de disco em kibibyte (1024 bytes, sendo o padrão 512 unidades de byte emdu
implementações padrão¹).-s
é resumir o uso do disco de cada arquivo (para aqueles do tipo diretório , não dá um detalhamento sobre todos os subdiretórios).Portanto, ele imprimirá o uso do disco (cumulativo para os do tipo diretório) de todos os arquivos não ocultos no diretório atual com o número de kibibyte seguido pelo nome do arquivo na mesma linha (embora tenha cuidado que os nomes dos arquivos podem ser feitos de mais de uma linha).
Com muitas
du
implementações, se alguns dos argumentos se referirem ao mesmo arquivo (hardlinks) ou o mesmo arquivo for encontrado em mais de um diretório, apenas o uso do disco da primeira ocorrência será contabilizado na saída.sort -rn
sort
s as linhas de sua entradan
umericamenter
inversas, portanto, assumindo que nenhum dos nomes de arquivo contenha caracteres de nova linha, classificará os arquivos / diretórios do maior para o menor (em termos de uso do disco).head
(abreviação dehead -n 10
) descarta todas as primeiras 10 linhas da saída desort
.Uma versão mais correta, com implementações GNU desses utilitários seria:
Onde
-l
força todos os hardlinks a serem contabilizados,-0
/-z
produz/processa registros delimitados por NUL para que funcione melhor para nomes de arquivos contendo caracteres de nova linha (e o./
prefixo pode fornecer uma indicação de onde cada nome de arquivo começa na saída para aqueles que contêm novas linhas em além de evitar problemas com nomes de arquivos começando com-
); usingsort -k1,1rn
em vez desort -rn
altera o comportamento em caso de empates (dois arquivos com o mesmo uso de disco), evitando ordenar os empates lexicalmente ao contrário.¹ para GNU
du
, o padrão é kibibytes, embora possa ser substituído por variáveis de ambiente incluindoPOSIXLY_CORRECT
,DU_BLOCK_SIZE
,BLOCK_SIZE
,BLOCKSIZE