web-dev-qa-db-ja.com

Grep --exclude/ - include構文を使用して、特定のファイルをgrepしないようにします。

ディレクトリツリーのテキストファイルで文字列foo=を探しています。それは一般的なLinuxマシン上にあります、私はbashシェルを持っています:

grep -ircl "foo=" *

ディレクトリには "foo ="にマッチする多くのバイナリファイルもあります。これらの結果は関連性がなく、検索が遅くなるので、grepにこれらのファイル(主にJPEGおよびPNG画像)の検索をスキップさせたいです。どうすればいいの?

私は--exclude=PATTERN--include=PATTERNオプションがあることを知っています、しかしパターンフォーマットは何ですか? grepのmanページはこう言います:

--include=PATTERN     Recurse in directories only searching file matching PATTERN.
--exclude=PATTERN     Recurse in directories skip file matching PATTERN.

grep include grep include exclude grep exclude を検索しても、関連するものが見つかりませんでした。

特定のファイルだけを扱うより良い方法があるのなら、私はそれだけです。問題のあるファイルを移動することはできません。特定のディレクトリだけを検索することはできません(ディレクトリ構造はいたるところにあり、すべてがあふれています)。また、私は何もインストールすることができないので、私は一般的なツール( grep または提案された find のような)を使用しなければなりません。

719
Piskvor

シェルグロビング構文を使用します。

grep pattern -r --include=\*.{cpp,h} rootdir

--excludeの構文は同じです。

スターはシェルによって拡張されないようにバックスラッシュでエスケープされていることに注意してください(--include="*.{cpp,h}"のように引用符で囲んでも同様に機能します)。そうでなければ、現在の作業ディレクトリにパターンと一致するファイルがあれば、コマンドラインはgrep pattern -r --include=foo.cpp --include=bar.h rootdirのようなものに展開され、foo.cppbar.hという名前のファイルのみが検索されます。

689
Adam Rosenfield

バイナリファイルをスキップしたいだけなら、-I(大文字のi)オプションを見てください。バイナリファイルは無視されます。私は定期的に次のコマンドを使います。

grep -rI --exclude-dir="\.svn" "pattern" *

それは再帰的に検索し、バイナリファイルを無視し、Subversionの隠しフォルダの中を探しません。職場で私の箱には "grepsvn"としてエイリアスされています。

211
rmeador

ack を見てください。これはまさにこれらの状況のた​​めに設計されています。あなたの例

grep -ircl --exclude=*.{png,jpg} "foo=" *

としてackを使って行われる

ack -icl "foo="

ackはデフォルトでバイナリファイルを探すことはなく、-rはデフォルトでオンになっているからです。もしCPPとHファイルだけが欲しいのなら、

ack -icl --cpp "foo="
61
Andy Lester

grep 2.5.3では--exclude-dirパラメータが導入されました。

grep -rI --exclude-dir=\.svn PATTERN .

環境変数を設定することもできます。GREP_OPTIONS = " - exclude-dir = .svn"

2番目に Andy's に投票して ack にしても、最高です。

34
Corey

私は久しぶりにこれを見つけました、あなたは複数の包含と除外を追加することができます。

grep "z-index" . --include=*.js --exclude=*js/lib/* --exclude=*.min.js
24
Rushabh Mehta

推奨されるコマンド:

grep -Ir --exclude="*\.svn*" "pattern" *

--excludeはベース名に対して機能するため、概念的には間違っています。言い換えれば、カレントディレクトリの.svnだけをスキップします。

12
Nicola

Grep 2.5.1では、この行を〜/ .bashrcまたは〜/ .bash profileに追加する必要があります。

export GREP_OPTIONS="--exclude=\*.svn\*"
11
deric

Grepの出力をgreppingすることは非常に役に立つことが時々あります:

grep -rn "foo=" . | grep -v "Binary file"

しかし、それでも実際にバイナリファイルの検索が妨げられることはありません。

9
Aaron Maenpaa

CentOS 6.6/Grep 2.6.3では、このように使用する必要があります。

grep "term" -Hnir --include \*.php --exclude-dir "*excluded_dir*"

等号 "="がないことに注意してください(そうでなければ、--include--excludeinclude-dir、および--exclude-dirは無視されます)

7
aesede

あなたがfindを使いたくないのであれば、私はその-Prune機能が好きです。


find [directory] \
        -name "pattern_to_exclude" -Prune \
     -o -name "another_pattern_to_exclude" -Prune \
     -o -name "pattern_to_INCLUDE" -print0 \
| xargs -0 -I FILENAME grep -IR "pattern" FILENAME

1行目で、検索したいディレクトリを指定します。たとえば、.(現在のディレクトリ)は有効なパスです。

2行目と3行目では、"*.png""*.gif""*.jpg"などを使用します。あなたがパターンを持っているのと同じだけこれらの-o -name "..." -Prune構造を使用してください。

4行目には、別の-ofindに "or"を指定))、および必要なパターンが必要です。最後に-printまたは-print0が必要です。 *.gif*.pngなどの画像を削除した後に残っている「その他すべて」が必要な場合は、-o -print0を使用すれば4行目が終了します。

最後に、5行目にはxargsへのパイプがあります。これは、それらの結果ファイルをそれぞれ受け取り、それらを変数FILENAMEに格納します。その後、grep-IRフラグ、"pattern"を渡し、次にFILENAMExargsで展開して、findで見つかったファイル名のリストにします。

あなたの特定の質問のために、ステートメントは次のようになるかもしれません:


find . \
     -name "*.png" -Prune \
     -o -name "*.gif" -Prune \
     -o -name "*.svn" -Prune \
     -o -print0 | xargs -0 -I FILES grep -IR "foo=" FILES
6
OnlineCop

私は当然のことですが、これが私の〜/ .bash_profileの外観です。

 export GREP_OPTIONS = " -  orl --exclude-dir = .svn --exclude-dir = .cache --color = auto" GREP_COLOR = '1; 32' 

2つのディレクトリを除外するには、--exclude-dirを2回使用する必要がありました。

5
4D4M

git grep

パフォーマンスに最適化され、特定のファイルを検索することを目的としたgit grepを使用してください。

デフォルトではバイナリファイルを無視し、あなたの.gitignoreを尊重します。 Git構造体で作業していないのであれば、--no-indexを渡すことでそれを使用することができます。

構文の例:

git grep --no-index "some_pattern"

他の例については、以下を参照してください。

4
kenorb

これを試してください。

 $が見つかりました。 -name "* .txt" -type f -print | xargsファイルgrep "foo =" | cut -d:-f1 

ここに設立: http://www.unix.com/Shell-programming-scripting/42573-search-files-excluding-binary-files.html

3
Gravstar

非再帰的に検索する場合は、 glop patterns を使用してファイル名を一致させることができます。

grep "foo" *.{html,txt}

htmlとtxtが含まれています。現在のディレクトリのみを検索します。

サブディレクトリを検索するには:

   grep "foo" */*.{html,txt}

サブディレクトリ内:

   grep "foo" */*/*.{html,txt}
3

これを見てください。

grep --exclude="*\.svn*" -rn "foo=" * | grep -v Binary | grep -v tags
2
suhas tawade

これらのスクリプトですべての問題が解決されるわけではありません。

du -ha | grep -i -o "\./.*" | grep -v "\.svn\|another_file\|another_folder" | xargs grep -i -n "$1"

このスクリプトは、ディレクトリを検索対象から除外するために「実際の」正規表現を使用しているため、非常に優れています。フォルダ名またはファイル名を "\ |"で区切るだけです。 grep上で-v

楽しめ!私のLinuxシェルで見つかりました! XD

2
villalvilla

ディレクトリにも多くのバイナリファイルがあります。特定のディレクトリだけを検索することはできません(ディレクトリ構造は大きな混乱です)。特定のファイルだけをグレイプするより良い方法はありますか?

ripgrep

これは現在のディレクトリを再帰的に検索するように設計された最も速いツールの1つです。これは Rust で書かれ、 Rustの正規表現エンジンの上に構築されています 最大の効率のために。ここで 詳細な分析を確認してください

だからあなたはただ実行することができます:

rg "some_pattern"

.gitignoreを尊重し、自動的に隠しファイル/ディレクトリとバイナリファイルをスキップします。

-g/--globを使用してファイルやディレクトリをインクルードまたは除外することもできます。グロブルールは.gitignoreグロブと一致します。 man rgを調べてください。

より多くの例については、見てください: grepで特定の拡張子と一致しないいくつかのファイルを除外する方法?

MacOSでは、brew install ripgrep経由でインストールできます。

2
kenorb

findとxargsはあなたの友達です。 grepの--excludeではなく、それらを使用してファイルリストをフィルタリングします。

のようなものを試してください

find . -not -name '*.png' -o -type f -print | xargs grep -icl "foo="
2
Andrew Stein

tcshの.aliasファイルに適しています。

alias gisrc 'grep -I -r -i --exclude="*\.svn*" --include="*\."{mm,m,h,cc,c} \!* *'

{mm、m、h、cc、c}の部分は引用符で囲まないでください。 〜キース

1
Keith Knauber

GNU grepへの--binary-files=without-matchオプションは、バイナリファイルをスキップするようにします。 (他の場所で言及されている-Iスイッチと同等です。)

(これはgrepの最新版を必要とするかもしれません;少なくとも2.5.3がそれを持っています。)

1
mjs

Grepからのすべてのバイナリ結果を無視する

grep -Ri "pattern" * | awk '{if($1 != "Binary") print $0}'

Awk部分はfooに一致するすべてのバイナリファイルfooを除外します。

0
lathomas64