我正在尝试在整个文件系统中搜索特定文本。此命令可以执行此操作,但它会在某些目录(如“/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,则可以使用它)会自行进行递归搜索,无需 和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