Encontre os maiores arquivos em um diretório - Tomando muito tempo

4

Estou tentando encontrar os 10 principais arquivos grandes de um diretório que tenha muitos subdiretórios e um número N de arquivos. Meu comando find está sendo executado para sempre, listando todos os arquivos e depois entrando no modo de classificação. Eu preciso de uma execução mais rápida. Na minha última execução, a listagem em si não foi concluída em 15 minutos e eu tive que encerrar a execução.

Eu usei os seguintes comandos find , nenhum deles está sendo executado rapidamente e eles são interrompidos:

find /opt/app -type f -print 2>/dev/null | xargs ls -lS 2>/dev/null |
    sort -k5,5rn | head -10

find /opt/app -xdev -ls | awk '{print $7, $11}' | " sort -rn "}' | head

find /opt/app -type f -exec ls -lS {} + 2>/dev/null | head -n 10 |
    awk '{ print $5, $9 }'

Qual seria a melhor maneira de fazer isso?

    
por Anoop Kumar KR 16.05.2018 / 06:04

4 respostas

5

Em qualquer caso, você precisará ler o conteúdo de todos os diretórios e fazer um lstat() , o que implica ler os dados do inode para obter o tamanho do arquivo para todos os arquivos antes de determinar qual arquivo é o maior.

E esse acesso de E / S a disco (ou rede para sistemas de arquivos em rede), a menos que todas as informações já estejam armazenadas em cache na memória, é a parte que levará mais tempo.

Existem algumas coisas desnecessárias que sua abordagem gosta de converter IDs de usuário / grupo em nomes de usuários / grupos, calcular representação de calendário de carimbos de data / hora, decodificar bytes em caracteres que manterão suas CPUs ocupadas além dos discos , mas a E / S de disco provavelmente ainda será o gargalo.

Você pode ignorar a maior parte desse processamento desnecessário se usar, por exemplo, globs e glob qualifiers de zsh :

ls -ldS /opt/apps/**/*(.DOL[1,10])

Ou com ferramentas GNU (recentes):

(export LC_ALL=C # avoid decoding bytes into characters and
                 # complex sorting orders. Note that it may affect
                 # the ls -l output format though.
 find /opt/apps -type f -printf '%s/%p
ls -ldS /opt/apps/**/*(.DOL[1,10])
' | sort -srnz | head -z | cut -zd/ -f2- | xargs -r0 ls -ldS)

E veja se isso faz com que seja mais rápido.

    
por 16.05.2018 / 11:25
2

sort não fornece saída até que todos os itens tenham sido classificados. Não pode voltar na saída e nos novos itens, então é assim que é. Em meus testes, o GNU sort se torna ativo assim que obtém saída suficiente para iniciar seus algoritmos de classificação, mas retém a saída até que tudo tenha sido classificado, portanto, sort e find estavam ativos durante o mesmo período de tempo (embora find estivesse ativo antes e sort permanecesse ativo mais tarde, havia sobreposição).

A maneira mais rápida de usar find é evitar outros comandos e processamento de texto, tanto quanto possível. Portanto, imprima o tamanho e o nome usando find em vez de executar ls várias vezes. Usando o GNU find (e assumindo nomes de arquivos sem novas linhas):

find /opt/app -xdev -type f -printf "%s %p\n" | sort -k1,1n | head

Ou você pode executar vários find s em paralelo:

(for d in /opt/app/*/; do find "$d" -xdev -type f -printf "%s %p\n" & done; wait) | sort -k1,1n | head

(isso pode se tornar prejudicial devido à intercalação de saída)

Mas você não obterá nenhuma saída até que sort tenha feito seu trabalho.

    
por 16.05.2018 / 10:11
1

O código a seguir fornecerá os principais arquivos grandes.

ls -l -R <folder path> | grep -v "^d" | awk '{print $5" "$9}' | sort -nrk1,1 | head -n10 | column -t

se você quiser o caminho completo do arquivo, tente o seguinte:

find <folder path> -type f -exec du -a {} + | sort -nr | head -10
    
por 16.05.2018 / 09:22
1

não tenho certeza se isso é o que você precisa, mas:

ls -lR $(pwd) | awk '
/:$/&&f{s=$0;f=0}
/:$/&&!f{sub(/:$/,"");s=$0;f=9;next}
NF&&f{ print s"/ "$0 }' | egrep -v '^.|^$|^total\ ' | awk '{print $6,$1$NF}' | sort -nk1 | tail -n 10
Saída:
13307 /home/pierdolia/repo/Dell-EMC-Ansible-Modules-for-iDRAC/library/dellemc_configure_raid.py
14029 /home/pierdolia/repo/Dell-EMC-Ansible-Modules-for-iDRAC/library/dellemc_configure_idrac_eventing.py
15199 /home/pierdolia/repo/Dell-EMC-Ansible-Modules-for-iDRAC/library/dellemc_configure_idrac_users.py
20294 /home/pierdolia/repo/Dell-EMC-Ansible-Modules-for-iDRAC/library/dellemc_configure_idrac_network.py
20851 /home/pierdolia/repo/Dell-EMC-Ansible-Modules-for-iDRAC/samples/dellemc_get_firmware_inventory.md
35149 /home/pierdolia/repo/Dell-EMC-Ansible-Modules-for-iDRAC/COPYING.md
49569 /home/pierdolia/repo/Dell-EMC-Ansible-Modules-for-iDRAC/docs/OMAM_1.0.1_Readme.pdf
65486 /home/pierdolia/repo/Dell-EMC-Ansible-Modules-for-iDRAC/samples/dellemc_get_system_inventory.md
89526 /home/pierdolia/repo/Dell-EMC-Ansible-Modules-for-iDRAC/docs/OMAM_1.0.1_Installation_Guide.pdf
438419 /home/pierdolia/repo/Dell-EMC-Ansible-Modules-for-iDRAC/docs/OMAM_1.0.1_Users_Guide.pdf
apenas um contras: se o diretório contiver muitos arquivos, que o ls não poderia manipular, isso não funcionará.

na minha experiência pessoal, tenho notado, que encontrar trabalhos mais longos que esses pequenos comandos, sim, não é a versão "final", pode ser encolhida, mas é muito boa.

P.S. Se você remover primeiro o AWK, ele exibirá apenas nomes de arquivos:

ls -lR $(pwd) | egrep -v '^.|^$|^total\ ' | sort -nk5 | tail -n 10
-rw-rw-r-- 1 pierdolia pierdolia 13307 May 14 13:22 dellemc_configure_raid.py
-rw-rw-r-- 1 pierdolia pierdolia 14029 May 14 13:22 dellemc_configure_idrac_eventing.py
-rw-rw-r-- 1 pierdolia pierdolia 15199 May 14 13:22 dellemc_configure_idrac_users.py
-rw-rw-r-- 1 pierdolia pierdolia 20294 May 14 13:22 dellemc_configure_idrac_network.py
-rw-rw-r-- 1 pierdolia pierdolia 20851 May 14 13:22 dellemc_get_firmware_inventory.md
-rw-rw-r-- 1 pierdolia pierdolia 35149 May 14 13:22 COPYING.md
-rw-rw-r-- 1 pierdolia pierdolia  49569 May 14 13:22 OMAM_1.0.1_Readme.pdf
-rw-rw-r-- 1 pierdolia pierdolia 65486 May 14 13:22 dellemc_get_system_inventory.md
-rw-rw-r-- 1 pierdolia pierdolia  89526 May 14 13:22 OMAM_1.0.1_Installation_Guide.pdf
-rw-rw-r-- 1 pierdolia pierdolia 438419 May 14 13:22 OMAM_1.0.1_Users_Guide.pdf
ou adicione o awk adicional:
ls -lR $(pwd) | egrep -v '^.|^$|^total\ ' | sort -nk5 | tail -n 10 | awk '{print $5,$NF}'
13307 dellemc_configure_raid.py
14029 dellemc_configure_idrac_eventing.py
15199 dellemc_configure_idrac_users.py
20294 dellemc_configure_idrac_network.py
20851 dellemc_get_firmware_inventory.md
35149 COPYING.md
49569 OMAM_1.0.1_Readme.pdf
65486 dellemc_get_system_inventory.md
89526 OMAM_1.0.1_Installation_Guide.pdf
438419 OMAM_1.0.1_Users_Guide.pdf 
    
por 16.05.2018 / 10:29

Tags