Linuxがパターンと一致しないファイルの検索とgrep


1

特定のテキストについてファイルシステム全体を検索しようとしています。このコマンドはそれを行いますが、「/ 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

grepLinuxを実行している場合に使用しているGNUは、findandを必要とせずに、それ自体で再帰検索を実行しますxargs。また--exclude-dir、「パターンDIRに一致するディレクトリを再帰的検索から除外する」オプションもあります。したがって、検索を次のように書くことができます。

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


次のコメントを更新:

またはgrepがサポートされていない場合は、とに頼らなければならないかもしれません。初めてそれを正しくすることはめったにありません。-R--exclude-dirfindxargs

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

私のバージョンのgrepはその引数をサポートしていないようです。Red Hat Enterprise Linux Serverリリース5.6を使用しています。これは私が持っているバージョンのmanページです:unixhelp.ed.ac.uk/CGI/man-cgi?grep
アンディアリメンディ

うーん、除外しようとしているディレクトリを含めるためのフィルターのようです。これを実行した場合:
アンディアリメンディ

先行-nameまたは-path用語が一致すると、ファイルシステムツリーのそのブランチの検索を停止するように-prune指示findします。-pruneより適切な説明については、オプションに関するセクションのfind(1)のマニュアルページを参照してください。Fedora 14システムでそのコマンドを簡単にテストしたところ、正常に機能しているように見えました。
ゲイリージョン

除外リストにさらにいくつかのディレクトリを追加する必要がありましたが、その構文は読みにくいです。同様のことを行うために、Pythonスクリプトを作成しました。ご協力ありがとうございますゲイリー!
アンディアリメンディ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.