ディレクトリツリーのテキストファイルで文字列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 のような)を使用しなければなりません。
シェルグロビング構文を使用します。
grep pattern -r --include=\*.{cpp,h} rootdir
--exclude
の構文は同じです。
スターはシェルによって拡張されないようにバックスラッシュでエスケープされていることに注意してください(--include="*.{cpp,h}"
のように引用符で囲んでも同様に機能します)。そうでなければ、現在の作業ディレクトリにパターンと一致するファイルがあれば、コマンドラインはgrep pattern -r --include=foo.cpp --include=bar.h rootdir
のようなものに展開され、foo.cpp
とbar.h
という名前のファイルのみが検索されます。
バイナリファイルをスキップしたいだけなら、-I
(大文字のi)オプションを見てください。バイナリファイルは無視されます。私は定期的に次のコマンドを使います。
grep -rI --exclude-dir="\.svn" "pattern" *
それは再帰的に検索し、バイナリファイルを無視し、Subversionの隠しフォルダの中を探しません。職場で私の箱には "grepsvn"としてエイリアスされています。
ack を見てください。これはまさにこれらの状況のために設計されています。あなたの例
grep -ircl --exclude=*.{png,jpg} "foo=" *
としてackを使って行われる
ack -icl "foo="
ackはデフォルトでバイナリファイルを探すことはなく、-rはデフォルトでオンになっているからです。もしCPPとHファイルだけが欲しいのなら、
ack -icl --cpp "foo="
私は久しぶりにこれを見つけました、あなたは複数の包含と除外を追加することができます。
grep "z-index" . --include=*.js --exclude=*js/lib/* --exclude=*.min.js
推奨されるコマンド:
grep -Ir --exclude="*\.svn*" "pattern" *
--excludeはベース名に対して機能するため、概念的には間違っています。言い換えれば、カレントディレクトリの.svnだけをスキップします。
Grep 2.5.1では、この行を〜/ .bashrcまたは〜/ .bash profileに追加する必要があります。
export GREP_OPTIONS="--exclude=\*.svn\*"
Grepの出力をgreppingすることは非常に役に立つことが時々あります:
grep -rn "foo=" . | grep -v "Binary file"
しかし、それでも実際にバイナリファイルの検索が妨げられることはありません。
CentOS 6.6/Grep 2.6.3では、このように使用する必要があります。
grep "term" -Hnir --include \*.php --exclude-dir "*excluded_dir*"
等号 "="がないことに注意してください(そうでなければ、--include
、--exclude
、include-dir
、および--exclude-dir
は無視されます)
あなたが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行目には、別の-o
(find
に "or"を指定))、および必要なパターンが必要です。最後に-print
または-print0
が必要です。 *.gif
、*.png
などの画像を削除した後に残っている「その他すべて」が必要な場合は、-o -print0
を使用すれば4行目が終了します。
最後に、5行目にはxargs
へのパイプがあります。これは、それらの結果ファイルをそれぞれ受け取り、それらを変数FILENAME
に格納します。その後、grep
に-IR
フラグ、"pattern"
を渡し、次にFILENAME
をxargs
で展開して、find
で見つかったファイル名のリストにします。
あなたの特定の質問のために、ステートメントは次のようになるかもしれません:
find . \
-name "*.png" -Prune \
-o -name "*.gif" -Prune \
-o -name "*.svn" -Prune \
-o -print0 | xargs -0 -I FILES grep -IR "foo=" FILES
私は当然のことですが、これが私の〜/ .bash_profileの外観です。
export GREP_OPTIONS = " - orl --exclude-dir = .svn --exclude-dir = .cache --color = auto" GREP_COLOR = '1; 32'
2つのディレクトリを除外するには、--exclude-dirを2回使用する必要がありました。
git grep
パフォーマンスに最適化され、特定のファイルを検索することを目的としたgit grep
を使用してください。
デフォルトではバイナリファイルを無視し、あなたの.gitignore
を尊重します。 Git構造体で作業していないのであれば、--no-index
を渡すことでそれを使用することができます。
構文の例:
git grep --no-index "some_pattern"
他の例については、以下を参照してください。
これを試してください。
$が見つかりました。 -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
非再帰的に検索する場合は、 glop patterns を使用してファイル名を一致させることができます。
grep "foo" *.{html,txt}
htmlとtxtが含まれています。現在のディレクトリのみを検索します。
サブディレクトリを検索するには:
grep "foo" */*.{html,txt}
サブディレクトリ内:
grep "foo" */*/*.{html,txt}
これを見てください。
grep --exclude="*\.svn*" -rn "foo=" * | grep -v Binary | grep -v tags
これらのスクリプトですべての問題が解決されるわけではありません。
du -ha | grep -i -o "\./.*" | grep -v "\.svn\|another_file\|another_folder" | xargs grep -i -n "$1"
このスクリプトは、ディレクトリを検索対象から除外するために「実際の」正規表現を使用しているため、非常に優れています。フォルダ名またはファイル名を "\ |"で区切るだけです。 grep上で-v
楽しめ!私のLinuxシェルで見つかりました! XD
ディレクトリにも多くのバイナリファイルがあります。特定のディレクトリだけを検索することはできません(ディレクトリ構造は大きな混乱です)。特定のファイルだけをグレイプするより良い方法はありますか?
ripgrep
これは現在のディレクトリを再帰的に検索するように設計された最も速いツールの1つです。これは Rust で書かれ、 Rustの正規表現エンジンの上に構築されています 最大の効率のために。ここで 詳細な分析を確認してください 。
だからあなたはただ実行することができます:
rg "some_pattern"
.gitignore
を尊重し、自動的に隠しファイル/ディレクトリとバイナリファイルをスキップします。
-g
/--glob
を使用してファイルやディレクトリをインクルードまたは除外することもできます。グロブルールは.gitignore
グロブと一致します。 man rg
を調べてください。
より多くの例については、見てください: grepで特定の拡張子と一致しないいくつかのファイルを除外する方法?
MacOSでは、brew install ripgrep
経由でインストールできます。
findとxargsはあなたの友達です。 grepの--excludeではなく、それらを使用してファイルリストをフィルタリングします。
のようなものを試してください
find . -not -name '*.png' -o -type f -print | xargs grep -icl "foo="
tcshの.aliasファイルに適しています。
alias gisrc 'grep -I -r -i --exclude="*\.svn*" --include="*\."{mm,m,h,cc,c} \!* *'
{mm、m、h、cc、c}の部分は引用符で囲まないでください。 〜キース
GNU grep
への--binary-files=without-match
オプションは、バイナリファイルをスキップするようにします。 (他の場所で言及されている-I
スイッチと同等です。)
(これはgrep
の最新版を必要とするかもしれません;少なくとも2.5.3がそれを持っています。)
Grepからのすべてのバイナリ結果を無視する
grep -Ri "pattern" * | awk '{if($1 != "Binary") print $0}'
Awk部分はfooに一致するすべてのバイナリファイルfooを除外します。