Linux: Encontre o segundo maior arquivo / diretório em tamanho usando comandos

1

Introdução

Encontre o segundo maior arquivo / diretório em tamanho usando comandos.

O que eu tenho

du /etc/ -hsx * | sort -rh | head -2

Este comando mostra-me duas linhas que, pelas opções que escolhi, obtém os 2 maiores arquivos / diretórios dentro de / etc /.

Pergunta

E se eu quiser apenas encontrar o segundo maior arquivo? Como posso fazer isso?

Exemplo, fazendo o comando sudo du /etc/ -hsx * | sort -rh | head -2 | tail -1

Eu obtenho o resultado

1.5M snap

mas o que eu esperava é obter apenas o nome, não o tamanho ou outro. Apenas o nome. Eu também li que isso pode ser feito com o comando ls também.

    
por WhiteGlove 07.11.2018 / 19:50

5 respostas

1

Assumindo que por tamanho , você quer dizer o uso de disco de arquivos não-diretório ou o uso cumulativo de todos os arquivos referenciados através dos arquivos de diretório (como seu uso de du sugere), com utilitários GNU, você poderia fazer:

sudo LC_ALL=C du -al0d1 /etc |
  sort -zrn |
  tail -zn+2 |
  head -zn1 |
  cut -zf2- |
  tr '
sudo LC_ALL=C du -al0d1 /etc |
  sort -zrn |
  tail -zn+2 |
  head -zn1 |
  cut -zf2- |
  tr '%pre%' '\n'
' '\n'

O tail + head + cut também pode ser substituído por sed -z $'1d;s/^[^\t]*\t//;q' .

Notas:

  • com du /etc/ -hsx * (que assume o GNU find e que POSIXLY_CORRECT não está no ambiente porque você está usando opções após argumentos não opcionais), você está obtendo o disco uso de /etc e de todos os arquivos não ocultos no diretório atual .
  • usando -a e -d1 (uma extensão GNU) resolve todos os problemas de * excluindo diretórios ocultos ou atingindo o limite de número de argumentos.
  • -h não é apenas não-portátil, mas você também perde muita precisão (provavelmente fará com que você relate o arquivo errado), e torna o trabalho sort mais difícil, por isso é bastante contraproducente.
  • sem -l (extensão GNU), os links físicos são contados apenas uma vez, portanto, se some-large-file for encontrado como /etc/dir1/some-large-file e /etc/dir2/other-link-to-some-large-file , o espaço em disco ocupado por some-large-file será contabilizado apenas como um esses diretórios por du .
  • a nova linha é um caractere tão válido quanto qualquer outro em um nome de arquivo (o macOS costumava usar nomes de arquivos com caracteres de nova linha em /etc IIRC). Então, geralmente você não pode usar processamento de texto baseado em linha para lidar com isso. A maioria dos utilitários GNU tem -z ou -0 opções para trabalhar com registros delimitados por NUL.
  • Observe que, nessa lista classificada, o primeiro registro será de /etc . Então, pegando o segundo registro, na verdade estamos reportando o arquivo / dir mais pesado em /etc , não o segundo mais pesado.
  • Se houver empates, o nome do arquivo que classifica por último na ordem de intercalação de localidade será escolhido por meio da comparação de último recurso feita por sort sem -s .
por 07.11.2018 / 21:10
2

What if I only want to find the second biggest file? How can I do it?

Opção zsh obrigatória:

zsh -c 'print -r /etc/**/*(DoL[-2])'

Isso invoca zsh e pede para imprimir o argumento, que é:

  • uma expansão de nome de arquivo recursiva **/*
  • classificado ( o rdered) por tamanho ( L ingth), em tamanho crescente
  • D ativa dotglob para esse glob, então também considera arquivos ou arquivos ocultos em diretórios ocultos.
  • limitado à segunda entrada da lista ( [-2] )
por 07.11.2018 / 20:18
0

Provavelmente, uma das opções seria inverter o resultado usando sort e usar head -1 ? Como:

du /etc/ -hsx * | sort -rh | head -2 | sort -r | head -1
    
por 07.11.2018 / 19:56
0

Use a cauda

du /etc/ -hsx * | sort -rh | head -2 | tail -1
    
por 07.11.2018 / 19:56
0

Com sed , basta adicionar:

 | sed -n 2p

E não é necessário fazer isso cabeça .

Complete o comando:

du /etc/ -hsx * | sort -rh | sed -n 2p

Se você quiser continuar usando head após a classificação, adicione essa cauda :

 | tail +2

Complete o comando:

du /etc/ -hsx * | sort -rh | head -2 | tail +2
    
por 07.11.2018 / 19:55