Linux encontrar e grep para arquivos não correspondem padrão

1

Estou tentando pesquisar o sistema de arquivos inteiro para um texto específico. Este comando faz isso, mas fica preso em certos diretórios como '/ proc':

find / -print0|xargs -0 grep whatever 

O que eu gostaria de fazer é enviar apenas arquivos para o grep que não combinem com '/ sys' '/ proc' '/ tmp' '/ lib'.

Atualizar : Após a ajuda do Gary abaixo, precisei adicionar mais alguns diretórios excluídos, então decidi escrever um script python para fazer isso:

#!/usr/bin/python
import sys
import os
from os.path import join, getsize
import time
import re

search = "192.168.30"
searchRoot = "/"
reobj = re.compile(r"^/var|^/dev|^/proc|^/sys|^/bin|^/boot|^/home|^/lost|^/media|^/misc|^/mnt|^/net|^/sbin|^/selinux|\.log")

start = time.time()
for root, dirs, files in os.walk(searchRoot):
    for name in files:
        fullPath = os.path.join(root, name)
        if not reobj.search(fullPath):
            try:
                fileSize = os.path.getsize(fullPath)
                if (fileSize < 51200):
                    try:
                        #print fullPath
                        fileobj = open(fullPath, 'r')
                        text = fileobj.read()
                        fileobj.close()
                        index = text.find(search)
                        if (index > -1):
                            print index, ":", fullPath
                            sys.stdout.flush()
                    except:
                        pass
            except:
                pass

print "Completed search for", search, "in", searchRoot, "in",  time.time() - start, "seconds."
Andy Arismendi
fonte

Respostas:

1

GNU grep, que é o que você está usando se você estiver executando o Linux, fará buscas recursivas por si só, sem a necessidade de find e xargs. Ele também tem um --exclude-dir opção para "Excluir diretórios correspondentes ao padrão DIR de pesquisas recursivas". Então você poderia escrever sua pesquisa como

grep -R --exclude-dir=/sys --exclude-dir=/proc --exclude-dir=/tmp --exclude-dir=/lib whatever /


Atualize o seguinte comentário:

Se seu grep não suporta -R ou --exclude-dir, então você pode ter que recorrer a find e xargs, que funcionam bem, mas tem uma sintaxe complicada para essa tarefa. Eu raramente acerto na primeira vez.

find / -path /sys -prune -o \( -path /proc -prune -o \( -path /tmp -prune -o \( -path /lib -prune \) \) \) -o -print0 | xargs -0 grep whatever
garyjohn
fonte
Parece que minha versão do grep não suporta esse argumento. Estou no Servidor Red Hat Enterprise Linux versão 5.6. Esta é a página man da versão que tenho: unixhelp.ed.ac.uk/CGI/man-cgi?grep .
Andy Arismendi
Hmm parece que os filtros para incluir os dirs eu estou tentando excluir. Se eu executar isso:
Andy Arismendi
Quando o anterior -name ou -path jogos a termo, -prune conta find para parar de procurar essa ramificação da árvore do sistema de arquivos. Leia a página man find (1), a seção sobre -prune opção para uma melhor explicação. Eu testei esse comando brevemente no meu sistema Fedora 14 e ele pareceu funcionar corretamente.
garyjohn
Eu precisava adicionar mais alguns diretórios à lista de exclusão e essa sintaxe é muito difícil de ler. Eu escrevi um script python para fazer algo semelhante. Obrigado pela vossa ajuda Gary!
Andy Arismendi