Linux 查找和 grep 文件不匹配模式

Linux 查找和 grep 文件不匹配模式

我正在尝试在整个文件系统中搜索特定文本。此命令可以执行此操作,但它会在某些目录(如“/proc”)中挂起:

find / -print0|xargs -0 grep whatever 

我想要做的是仅将与“/sys”、“/proc”、“/tmp”、“/lib”不匹配的文件发送到 grep。

更新:在下面得到 Gary 的帮助后,我需要添加一些排除的目录,因此我决定编写一个 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

GNU grep(如果您运行的是 Linux,则可以使用它)会自行进行递归搜索,无需 和findxargs它还有一个--exclude-dir选项“从递归搜索中排除与模式 DIR 匹配的目录”。因此,您可以将搜索写为

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


更新以下评论:

如果您grep不支持-R--exclude-dir,那么您可能不得不求助于findxargs,虽然它们工作正常,但语法对于此任务来说很混乱。我很少第一次就做对。

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

相关内容