Linux find e grep para arquivos que não correspondem ao padrão

1

Estou tentando pesquisar em todo o sistema de arquivos por 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 eu precisei adicionar mais alguns diretórios excluídos, então eu 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."
    
por Andy Arismendi 27.10.2011 / 01:01

1 resposta

1

O GNU grep , que é o que você está usando se estiver executando o Linux, fará pesquisas recursivas sozinho, sem a necessidade de find e xargs . Ele também tem uma opção --exclude-dir 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 /

Atualizar comentário a seguir:

Se o grep não der suporte a -R ou --exclude-dir , talvez seja necessário recorrer a find e xargs , que funcionam bem, mas tem uma sintaxe confusa para esta tarefa. Eu raramente acerto da primeira vez.

find / -path /sys -prune -o \( -path /proc -prune -o \( -path /tmp -prune -o \( -path /lib -prune \) \) \) -o -print0 | xargs -0 grep whatever
    
por 27.10.2011 / 01:43