1

Я пытаюсь найти во всей файловой системе определенный текст. Эта команда делает это, но она зависает в определенных каталогах, таких как '/proc':

find / -print0|xargs -0 grep whatever 

Что я хотел бы сделать, так это отправлять в grep только те файлы, которые не совпадают с '/sys' '/proc' '/tmp' '/lib'.

Обновление: после помощи Гэри мне нужно было добавить еще несколько исключенных каталогов, поэтому я решил написать скрипт на python для этого:

#!/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."

1 ответ1

1

GNU grep , который вы используете, если вы используете Linux, будет выполнять рекурсивный поиск сам по себе, без необходимости find и xargs . Он также имеет параметр --exclude-dir для «Исключения каталогов, соответствующих шаблону DIR, из рекурсивных поисков». Таким образом, вы можете написать свой поиск как

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


Обновить следующий комментарий:

Если ваш grep не поддерживает -R или --exclude-dir , то вам, возможно, придется прибегнуть к find и xargs , которые отлично работают, но имеют грязный синтаксис для этой задачи. Я редко делаю это правильно с первого раза.

find / -path /sys -prune -o \( -path /proc -prune -o \( -path /tmp -prune -o \( -path /lib -prune \) \) \) -o -print0 | xargs -0 grep whatever

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .