grep
すべてのディレクトリとサブディレクトリを再帰的にするにはどうすればよいですか?
find . | xargs grep "texthere" *
grep -rin xlsx *.pl
Redhat Linuxでは動作しません。「一致しません」というエラーが表示されます。
grep
すべてのディレクトリとサブディレクトリを再帰的にするにはどうすればよいですか?
find . | xargs grep "texthere" *
grep -rin xlsx *.pl
Redhat Linuxでは動作しません。「一致しません」というエラーが表示されます。
回答:
grep -r "texthere" .
最初のパラメーターは検索する正規表現を表し、2番目のパラメーターは検索するディレクトリを表します。この場合、.
は現在のディレクトリを意味します。
注:これはGNU grepで機能し、Solarisなどの一部のプラットフォームでは、従来の実装ではなく、GNU grepを使用する必要があります。Solarisの場合、これはggrep
コマンドです。
AIX 5.3
たとえば、付属のgrepでは機能しません。
必要なファイルの拡張子またはパターンがわかっている場合は、--include
オプションを使用する方法もあります。
grep -r --include "*.txt" texthere .
で除外するファイルについて言及することもできます--exclude
。
コードを頻繁に検索する場合、Ag(The Silver Searcher)はgrepのはるかに高速な代替手段であり、コードの検索用にカスタマイズされています。たとえば、デフォルトでは再帰的であり.gitignore
、にリストされているファイルとディレクトリを自動的に無視するため、同じ厄介な除外オプションをgrepまたはfindに渡さなくてもかまいません。
=
Ubuntu では、 ``の代わりにうまく機能します。PS:これはバッククォートされたスペースであるはずですが、SOマークダウンパーサーは失敗しました。
grep
はAgではなく、に賛成しました。ご存知のように:)
--include "*.txt" --include "*.TXT"
また:
find ./ -type f -print0 | xargs -0 grep "foo"
しかしgrep -r
、より良い答えです。
find . -type f -exec grep "foo" '{}' \;
、サポートされている場所でうまく機能します。
find ./ -type f -print0 | xargs -0 grep "foo"
私は常に使用しています(GoWのある Windowsでも-WindowsのGnuでも):
grep --include="*.xxx" -nRHI "my Text to grep" *
これには次のオプションが含まれます。
--include=PATTERN
一致するファイルのみを検索するディレクトリで再帰します
PATTERN
。
-n, --line-number
出力の各行の前に、入力ファイル内の行番号を付けます。
(注:phuclvは、-n
パフォーマンスを大幅に低下させるコメントを 追加するため、そのオプションをスキップすることができます)
-R, -r, --recursive
各ディレクトリの下のすべてのファイルを再帰的に読み取ります。これは
-d recurse
オプションと同等です。
-H, --with-filename
一致ごとにファイル名を出力します。
-I
一致するデータが含まれていないかのようにバイナリファイルを処理します。
これは--binary-files=without-match
オプションと同等です。
また、大文字と小文字を区別しない結果が必要な場合は、' i
'(-nRHIi
)を追加できます。
私は得ることができます:
/home/vonc/gitpoc/passenger/gitlist/github #grep --include="*.php" -nRHI "hidden" *
src/GitList/Application.php:43: 'git.hidden' => $config->get('git', 'hidden') ? $config->get('git', 'hidden') : array(),
src/GitList/Provider/GitServiceProvider.php:21: $options['hidden'] = $app['git.hidden'];
tests/InterfaceTest.php:32: $options['hidden'] = array(self::$tmpdir . '/hiddenrepo');
vendor/klaussilveira/gitter/lib/Gitter/Client.php:20: protected $hidden;
vendor/klaussilveira/gitter/lib/Gitter/Client.php:170: * Get hidden repository list
vendor/klaussilveira/gitter/lib/Gitter/Client.php:176: return $this->hidden;
...
-R
オプションにより再帰的に)フォルダーに適用させます。
*
または.
globパターン(シェルによって解釈されます):unix.stackexchange.com/a/64695/7490。' .
'は、ドットファイルまたはドットフォルダも選択します(など.git/
)
POSIXシステムでは、あなたが見つからない-r
ため、パラメータをgrep
、あなたgrep -rn "stuff" .
の意志は実行されませんが、あなたが使用している場合find
、コマンドをそれは以下となります。
find . -type f -exec grep -n "stuff" {} \; -print
で合意したSolaris
とHP-UX
。
-exec
オプション-シンボルは{}
、現在で見つかったファイル名への参照ですfind
(私たちが見つけたファイル名で何かを行うことです)ツールは、また、-exec
オプションはで終了する必要があり;
、これがすべてであるので、(EXECコマンドの終了マーク)のシンボルが、シェルで実行しているそのシンボルはエスケープする必要があります。最後に-print
オプションを使用すると、find
ツールは検出されたファイル名を画面に出力できます。
**
使用はgrep -r
機能しますが、特に大きなフォルダーでは、やり過ぎになる場合があります。
より実用的な使用法として、ここではグロビング構文(**
)を使用する構文を示します。
grep "texthere" **/*.txt
これは、パターンが選択されたパターンを持つ特定のファイルのみを把握します。Bash +4やzshなどのサポートされているシェルで機能します。
この機能をアクティブにするには、次を実行しますshopt -s globstar
。
参照:Linuxで特定のテキストを含むすべてのファイルを見つけるにはどうすればよいですか?
git grep
Gitバージョン管理下のプロジェクトでは、次を使用します。
git grep "pattern"
はるかに速いです。
ripgrep
大規模なプロジェクトの場合、最も速いgreppingツールはripgrep
、デフォルトでファイルを再帰的にgrepsすることです。
rg "pattern" .
これは、有限オートマトン、SIMD、および積極的なリテラル最適化を使用して検索を非常に高速にするRustの正規表現エンジンの上に構築されています。詳細な分析はここで確認してください。
の特定の名前files
をpath
再帰的に含むwith を検索string
するには、以下のコマンドを使用しますUNIX
:
find . | xargs grep "searched-string"
のためにLinux
:
grep -r "searched-string" .
UNIX
サーバー上のファイルを見つける
find . -type f -name file_name
Linuxサーバーでファイルを検索する
find . -name file_name
シンボリックリンクではなく、実際のディレクトリのみをたどる場合は、
grep -r "thingToBeFound" directory
シンボリックリンクと実際のディレクトリをたどる場合(無限再帰に注意してください)、
grep -R "thing to be found" directory
再帰的にgrepを実行しようとしているため、次のオプションも役立つ場合があります。
-H: outputs the filename with the line
-n: outputs the line number in the file
したがって、現在のディレクトリまたは任意のサブディレクトリでDarth Vaderを含むすべてのファイルを検索し、ファイル名と行番号をキャプチャしたいが、再帰がシンボリックリンクをたどらないようにするには、コマンドは次のようになります。
grep -rnH "Darth Vader" .
ディレクトリでcatという単語のすべての言及を検索する場合
/home/adam/Desktop/TomAndJerry
そしてあなたは現在ディレクトリにいます
/home/adam/Desktop/WorldDominationPlot
ファイル名をキャプチャし、文字列 "cats"のインスタンスの行番号はキャプチャしません。また、再帰がシンボリックリンクを見つけた場合、それをたどります。次のいずれかを実行します。
grep -RH "cats" ../TomAndJerry #relative directory
grep -RH "cats" /home/adam/Desktop/TomAndJerry #absolute directory
ソース:
「grep --help」を実行する
シンボリックリンクの簡単な紹介、この回答を読んでいて、それらへの私の参照で混乱した人のために:https : //www.nixtutor.com/freebsd/understanding-symbolic-links/
agはこれを実行するための私のお気に入りの方法ですgithub.com/ggreer/the_silver_searcher。基本的にはackと同じですが、いくつかの最適化が追加されています。
ここに短いベンチマークがあります。各テストの前にキャッシュをクリアします(/ubuntu/155768/how-do-i-clean-or-disable-the-memory-cacheを参照)
ryan@3G08$ sync && echo 3 | sudo tee /proc/sys/vm/drop_caches
3
ryan@3G08$ time grep -r "hey ya" .
real 0m9.458s
user 0m0.368s
sys 0m3.788s
ryan@3G08:$ sync && echo 3 | sudo tee /proc/sys/vm/drop_caches
3
ryan@3G08$ time ack-grep "hey ya" .
real 0m6.296s
user 0m0.716s
sys 0m1.056s
ryan@3G08$ sync && echo 3 | sudo tee /proc/sys/vm/drop_caches
3
ryan@3G08$ time ag "hey ya" .
real 0m5.641s
user 0m0.356s
sys 0m3.444s
ryan@3G08$ time ag "hey ya" . #test without first clearing cache
real 0m0.154s
user 0m0.224s
sys 0m0.172s
これはうまくいくはずです:
grep -R "texthere" *
ディレクトリ構造からすべてのファイルの特定のコンテンツを探している場合はfind
、何をしているのかがより明確であるため、次のように使用できます。
find -type f -exec grep -l "texthere" {} +
なお、-l
(Lのdowncase)は、テキストを含むファイルの名前を示します。代わりに試合そのものを印刷したい場合は、削除してください。または-H
、一致と一緒にファイルを取得するために使用します。まとめると、他の選択肢は次のとおりです。
find -type f -exec grep -Hn "texthere" {} +
どこに-n
行番号を出力します。
find
不必要な使用とxargs
、withの+
代わりの使用の両方を回避するための唯一のソリューションであるとの投票により、大量の不要なプロセスの起動を回避します。:-)\;
-exec
これは私の現在のマシンで私のケースで機能したものです(Windows 7ではgit bash):
find ./ -type f -iname "*.cs" -print0 | xargs -0 grep "content pattern"
スペースのあるパスの-print0と-0は常に忘れます。
編集:私の優先ツールは、代わりにripgrepです:https : //github.com/BurntSushi/ripgrep/releases。これは本当に高速で、デフォルトが優れています(デフォルトの再帰のように)。私の元の答えと同じ例ですが、ripgrepを使用しています:rg -g "*.cs" "content pattern"
grep -r "texthere" .
(終了時の通知期間)
(^ credit:https : //stackoverflow.com/a/1987928/1438029)
明確化:
grep -r "texthere" /
(すべてのディレクトリとサブディレクトリを再帰的にgrepします)
grep -r "texthere" .
(これらのディレクトリとサブディレクトリを再帰的にgrepします)
grep [options] PATTERN [FILE...]
【オプション】
-R, -r, --recursive
各ディレクトリの下のすべてのファイルを再帰的に読み取ります。
これは
-d recurse
or--directories=recurse
オプションと同等です。
$ grep --help
$ grep --help |grep recursive
-r, --recursive like --directories=recurse
-R, --dereference-recursive
2018年には、あなたが使用したいripgrep
か、the-silver-searcher
彼らは道より高速な代替よりもあるため。
以下は、第1レベルのサブディレクトリが336個あるディレクトリです。
% find . -maxdepth 1 -type d | wc -l
336
% time rg -w aggs -g '*.py'
...
rg -w aggs -g '*.py' 1.24s user 2.23s system 283% cpu 1.222 total
% time ag -w aggs -G '.*py$'
...
ag -w aggs -G '.*py$' 2.71s user 1.55s system 116% cpu 3.651 total
% time find ./ -type f -name '*.py' | xargs grep -w aggs
...
find ./ -type f -name '*.py' 1.34s user 5.68s system 32% cpu 21.329 total
xargs grep -w aggs 6.65s user 0.49s system 32% cpu 22.164 total
OSXでは、これにより次のものがインストールされripgrep
ますbrew install ripgrep
。これがインストールしますsilver-searcher
:brew install the_silver_searcher
。
rg
、再帰的なgrepコマンドを最初からやり直すことにかなりの優位性があります。使用rg
:rg foo
。UNIXツールの使用:find . | xargs grep foo
。また、ファイルに引用が含まれている場合は、を使用する必要がありますfind . -print0 | xargs -0 grep foo
。これを年に数回使用すると、覚えているでしょうか?
find . -type f -exec grep 'regex' {} +
確かにあなたはどんな規則的にこれらのツールを使用している場合は覚えやすいです。しかし、おそらくあなたは、実行する必要がありますctags
またはetags
あなたが頻繁にものを見つける必要がある場合は、とにかく自分のソースツリーに。
私のIBM AIXサーバー(OSバージョン:AIX 5.2)では、以下を使用します。
find ./ -type f -print -exec grep -n -i "stringYouWannaFind" {} \;
これにより、次のようにファイル内のパス/ファイル名と相対行番号が出力されます。
./inc/xxxx_x.h
2865:/ **説明:stringYouWannaFind * /
とにかく、それは私のために働きます:)
以下は、String
再帰的にUnix
とLinux
環境を検索するコマンドです。
以下のためのUNIX
コマンドです。
find . -name "string to be searched" -exec grep "text" "{}" \;
以下のためのLinux
コマンドです。
grep -r "string to be searched" .
find . -type f | xargs grep whatever
検索で一致するファイルが多すぎる場合、解決策の種類によって「引数リストが長くなります」エラーが発生することに注意してください。
最善の策ですgrep -r
が、それが利用できない場合は、find . -type f -exec grep -H whatever {} \;
代わりに使用してください。
xargs
特に「引数リストが長すぎる」問題の回避策です。
find . -type f | xargs -L 100 grep whatever
xargs
は、この動作をそのまま使用できるように標準化されています。「xargs
ユーティリティは、コマンドラインが呼び出されたときに、引数と環境リストの組み合わせが{ARG_MAX} -2048バイトを超えないように、コマンドラインの長さを制限します。」
これは、指定されたフォルダー($ 1)のすべてのサブフォルダーをトラバースし、指定grep
されたファイル($ 2)で指定された文字列($ 3)を検索する再帰(bashおよびshで軽くテストされた)関数です。
$ cat script.sh
#!/bin/sh
cd "$1"
loop () {
for i in *
do
if [ -d "$i" ]
then
# echo entering "$i"
cd "$i"
loop "$1" "$2"
fi
done
if [ -f "$1" ]
then
grep -l "$2" "$PWD/$1"
fi
cd ..
}
loop "$2" "$3"
実行して出力例:
$ sh script start_folder filename search_string
/home/james/start_folder/dir2/filename