Comando "grep" com limite de Tamanho de arquivo [RESOLVIDO]

1. Comando "grep" com limite de Tamanho de arquivo [RESOLVIDO]

Mateus Nunes
mateusnunes

(usa Lubuntu)

Enviado em 22/05/2020 - 12:50h

Como fazer o grep procurar string apenas em arquivos abaixo de 1MB ? É possível?
Caso não seja possível, é possível procurar apenas nos 10.000 primeiros caracteres? Como?

Preciso disto para fazer uma busca na raiz, e quero eliminar arquivos grandes para agilizar a pesquisa.

Obrigado,

Mateus Nunes


  


2. MELHOR RESPOSTA

Sandro Marcell
SMarcell

(usa Slackware)

Enviado em 22/05/2020 - 16:14h

Use o find pra limitar a busca por tamanho de arquivo. Ex.:


# Busca arquivos menores que 1MB e os passa ao grep para pesquisa da string
find / -type f -size -1M -exec grep -i string {} +


Forma otimizada: find / -type f -size -1M -print0 | xargs -P0 -0 grep -i string

3. Re: Comando "grep" com limite de Tamanho de arquivo [RESOLVIDO]

Mateus Nunes
mateusnunes

(usa Lubuntu)

Enviado em 23/05/2020 - 11:20h

Que maravilha Smarcell, deu certinho, muito obrigado.

No final o comando que utilizei ficou assim:

find / ! -path "/media/*" ! -path "/proc/*" ! -path "/sys/*" -size -20k -type f -print0 | xargs -P0 -0 grep -l "/home/mateus/.var/app/com.visualstudio.code/data/node_modules/bin"

Viva o Linux



4. Re: Comando

mau blau
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..







Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner
Linux banner
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts