単一の組み込みコマンドで、サブディレクトリにまたがるファイル内の部分文字列を検索しますか?


10

Windowsでは、すべてのサブディレクトリのすべてのファイルから文字列を検索したい場合は、次のようにします。

findstr /C:"the string" /S *.h

しかし、Linux(たとえば、Ubuntuの)で私が関与するいくつかのパイプされたコマンドよりも、他の方法を見つけていないfindxargsgrep(例では、このページにある:どのように私は再帰的にサブディレクトリをgrepすることができますか?)。ただし、私の質問は異なります。シェルスクリプトを記述しなくても、この魔法を介して機能する組み込みのコマンドは1つありますか?

回答:


19

GNU grepでは、サブディレクトリを再帰的に検索できます。

grep -r --include='*.h' 'the string' .

私はUbuntuでこの正確なコマンドラインを試しましたが、「g」:無効なオプション-「M」を取得しましたが、「M」はどこにも表示されません...不可解
Guido Domenici

@Guidoはここでうまく動作します
phunehehe

提案編集 TomasGは、最後の変更をお勧め*する'*':「最後のワイルドカードを引用は避けるエラーに必要とされるときといくつかのファイル名が開始- 」
マイケルMrozek

奇妙なイベントのひねりの中で、元の回答に入力されているように、それは今私にとってもうまくいきます。ありがとう!
グイドドメニチ

1
@Guido:現在のディレクトリにあると呼ばれるファイル-Msomething、またはGREP_OPTIONS設定に問題がある可能性があります。
Gilles 'SO-悪をやめる'

2

grep -r searchpattern /path/to/start/in

現在のディレクトリの場合/path/to/start/in/は、単に " ."にすることができます。



0

この魔法を介して動作する単一の組み込みコマンドはありますか?

わかりやすくするために、そのようなコマンドが存在することを想定することはできません

Unixには多くの異なる実装があり、それぞれに異なる癖があります。POSIX、共通の分母(およびUnices全体の標準に最も近いもの)は、このようなオプションを指定していませんgrep

他の回答でgrep述べたように、GNUのの実装には、必要なことを行う非標準のオプションがあります。この特定の実装はLinuxシステムでは一般的である可能性がありますが、一部のLinuxシステムでさえ、Unixでの使用を想定することはできません。

最後に、一度にすべてを実行しようとする1つの大きなモノリシック実行可能ファイルの使用よりも、いくつかのプリミティブプログラムの組み合わせを支持するのがUnixの哲学であることを述べておかなければなりません。

あなたの場合、ファイルシステムのクロールとストリーム内の一致する正規表現は、2つの別々のタスクです。それぞれを別のプログラムで扱うのは正常なことです。


0

指定されたディレクトリから文字列を検索するには、以下のコマンドを使用します

find <fullDirectoryPath> -name '*' -exec grep -l '<StringToFind>' {} \;

例えば:

find /apps_bev/apps/xfer/export/02210 -name '*' -exec grep -l '38221000001032' {} \;

1
grepは複数のファイルを引数としてとることができるため、+代わりに\;を使用して、grepファイルごとに1 回の呼び出しを実行しないようにする必要があります。これは非常に非効率です。
ステファンChazelas

1
ことを注意-name '*'名(一部では現在のロケールで有効なテキストでファイルに限りfind、少なくとも実装)が、他のディレクトリコンポーネントがまだ有効な文字を形成しないバイトの配列を含んでいてもよいです。-name '*'(不適切な名前のファイルを省略して)出力が有効なテキストであることを確認することを意図している場合はfind ... ! -name '*' -prune -o -exec grep ... {} +、を使用することもできます。これによりfind、不適切な名前のディレクトリに移動することもできなくなります。
ステファンChazelas
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.