blaublau22
(usa GoblinX)
Enviado em 24/05/2020 - 16:22h
forma otimizada que só usa bultins, fora o grep e du:
#!/bin/bash
trap exit INT TERM HUP
shopt -s dotglob globstar
while read f; do
{
[[ -f "$f" && -r "$f" ]] &&
s=( $( du "$f" ) ) && (( ${s[0]} < 10000 )) || exit
grep STRING "$f"
} &
done <<< "$( printf '%s\n' /{bin,dev,home,etc,lib,opt,usr}/** )"
wait
aqui, no comando de teste [[ ]], podemos ser mais específicos e colocar a opção '-r', somente se é uma arquivo com permissão de leitura..
mesmo fazendo esses três testes no loop, os builtins da shell são muito mais rápidos que o 'find'.
para uma avaliação aritmética simples, sendo $S um número inteiros, a velocidade dos testes do bash, equivalentes, é essa, mais rápido no topo:
(( S < 1000 ))
[[ $S < 1000 ]]
[[ $S -lt 1000 ]]
no zshell, o teste builtin mais moderno, o [[ ]], é sempre mais rápido..
eu testei aqui, substituindo o glob das pastass da raiz, com glob para o meu diretório de usuário somente '~'
o comando com find resulta em:
find ~ -type f -size -1M -exec grep linux {} +
find: ‘/home/me/.cache/yay/ruby-gettext/pkg’: Permission denied
find: ‘/home/me/.cache/yay/fwts-git/pkg’: Permission denied
o meu pequeno script aceita tantos arqumentos (aqui, arquivos no caso) quantos necessários pois são builtins, e usa 100% dos meus 4 cores..
o grep pode ficar bem mais rápido se você puder ajustar ele. por exemplo, se STRING for uma cadeia de caracteres fixa, pode usar a opção '-F' do grep. Ela ainda aceita a opção '-ix' etc, mas não vai aceitar nenhum caráter especial de regex como '^' ou '$' ou '*'..
o grep tem uma opção que ignora quando um arquivo é binário, no GNU grep, opção -a'.
se precisar mais rápido, use o silver searcher, pacote 'ag'...
observe que mandamos executar a lista de comandos do loop pro fundo, sim, em uma sub-shell..
coloquei o comando do printf para formar a lista de arquivos como here document. isso não vai deixar o loop muito mais devagar, exceto no começo, pq o que vai ser o gargalo é o grep..