encontra o único arquivo maior

4

Recebemos uma parte do tamanho de 4 TB. Quão eficiente é encontrar um arquivo com o maior tamanho.

Normalmente usamos:

du -ak | sort -k1 -bn | tail -1

e não é fácil digitalizar através de um tamanho tão grande e, em seguida, classificá-los novamente.

Todas as sugestões para saber apenas o único arquivo maior no compartilhamento.

E também du -ak está retornando o tamanho do diretório atual como (". 123455"). Como evito isso?

    
por Avinash 18.05.2014 / 18:44

2 respostas

6

Não conheço nenhuma outra maneira além de varrer a árvore de diretórios em questão para coletar os tamanhos de arquivo para que você possa determinar o arquivo maior. Se você sabe que há um limite de tamanho, você pode instruir a procurar para descartar arquivos que estão abaixo desse tamanho limite.

$ find . -type f -size +50M ....

Demitiria todos os arquivos abaixo do tamanho de 50MB. Se você souber que esses arquivos estão sempre em um local específico, poderá direcionar seu find para essa área, em vez de verificar o disco inteiro.

OBSERVAÇÃO: Esse é um método que eu normalmente uso desde que você não deveria estar recebendo arquivos aleatórios em não /var tipos de diretórios, normalmente.

Em relação a du , você pode informar a saída dos tamanhos em formatos legíveis por humanos usando a opção -h . O comando sort também sabe ordená-los, usando novamente a opção -h .

Exemplo

$ find /home/saml/apps -type f -size +50M -print0 | \
    du -h --files0-from=- | sort -h | tail -1
1.4G    /home/saml/apps/MeVisLabSDK2.2.1_gcc-64.bin

O find acima retorna a lista de arquivos > 50MB usando um caractere nulo ( du ) como o separador. O comando --files0-from=- pega essa lista e sabe dividir em nulos usando a opção tail -1 . Essa saída é então classificada por seus tamanhos humanos formatados.

Sem o %code% :

$ find /home/saml/apps -type f -size +50M -print0 | \
    du -h --files0-from=- | sort -h
55M /home/saml/apps/MeVisLabSDK/Packages/MeVis/ThirdParty/lib/libQtXmlPatternsMLAB.so.4.6.2.debug
55M /home/saml/apps/MeVisLabSDK/Packages/MeVis/ThirdParty/Sources/Qt4/qt/lib/libQtXmlPatternsMLAB.so.4.6.2.debug
56M /home/saml/apps/MeVisLabSDK/Packages/FMEwork/ThirdParty/lib/libitkvnl-4.0_d.a
66M /home/saml/apps/MeVisLabSDK/Packages/FMEwork/Release/lib/libMLDcmtkAccessories_d.so
79M /home/saml/apps/MeVisLabSDK/Packages/FMEwork/Release/lib/libMLDcmtkMLConverters_d.so
94M /home/saml/apps/MeVisLabSDK/Packages/MeVis/ThirdParty/lib/libQtGuiMLAB.so.4.6.2.debug
94M /home/saml/apps/MeVisLabSDK/Packages/MeVis/ThirdParty/Sources/Qt4/qt/lib/libQtGuiMLAB.so.4.6.2.debug
112M    /home/saml/apps/ParaView-3.14.1-Linux-64bit.tar.gz
204M    /home/saml/apps/Slicer-4.1.1-linux-amd64.tar.gz
283M    /home/saml/apps/MeVisLabSDK/Packages/FMEwork/Release/lib/libMLDcmtkIODWrappers_d.so
1.4G    /home/saml/apps/MeVisLabSDK2.2.1_gcc-64.bin
    
por 18.05.2014 / 20:00
4

Você precisa percorrer toda a árvore de diretórios e verificar o tamanho de cada arquivo para encontrar o maior deles.

No zsh, há uma maneira fácil de classificar arquivos por tamanho, graças à o qualificador glob :

print -rl -- **/*(D.oL)

Para ver apenas os maiores arquivos:

echo **/*(D.oL[-1])

Para ver os 10 maiores arquivos:

print -rl -- **/*(D.oL[-10,-1])

Você também pode usar ls -S para classificar os arquivos por tamanho. Por exemplo, isso mostra os 10 maiores arquivos. No bash, você precisa executar shopt -s globstar primeiro para ativar a globalização recursiva com ** ; em ksh93, execute set -o globstar primeiro e, em zsh, isso é feito imediatamente. Isso só funciona se não houver tantos arquivos que o comprimento combinado de seus nomes ultrapasse o limite da linha de comando.

ls -Sd **/* | head -n 10

Se houver muitos arquivos grandes, coletar as informações pode levar muito tempo, e você deve percorrer o sistema de arquivos apenas uma vez e salvar a saída em um arquivo de texto. Como você está interessado em arquivos individuais, use a opção -S do GNU du além de -a ; Dessa forma, a exibição de diretórios não inclui os arquivos de tamanho em subdiretórios, apenas arquivos diretamente nesse diretório, o que reduz o ruído.

du -Sak >du
sort -k1n du | head -n 2

Se você quer apenas o tamanho dos arquivos, você pode usar a ação -printf do GNU find.

find -type f -printf '%s\t%P\n' | sort -k1n >file-sizes.txt
tail file-sizes.txt

Observe que, se você tiver nomes de arquivos que contenham novas linhas, isso atrapalhará o processamento automatizado. A maioria dos utilitários GNU tem uma maneira de usar bytes nulos (que não podem aparecer em nomes de arquivos), por exemplo, du -0 , sort -z , \n em vez de %code% , etc.

    
por 19.05.2014 / 04:07