find (1) および grep (1) を使用して特定の文字列を含むファイルを検索
find . -type f -print -exec cat {} \; | grep some string
上記のコマンドではファイルパスが表示されません。
私が使っているのは Ubuntu, bash 4
.
find . -type f -print -exec cat {} \; | grep some string
上記のコマンドではファイルパスが表示されません。
私が使っているのは Ubuntu, bash 4
.
grep "some string" . -R
を使用していますが、より速く動作しています。
これは、あなたがgrep
にテキストのストリームを与えているからです。grep の引数にファイル名を与えていないので、一致した行がどのファイルから来たのかを推測することは期待できません。xargs
を使用してください。
find . -type f -print | xargs grep "some string"
GNU find/xargsを使用しているので、xargsがファイル名を読むにはこの方が安全です。
私は複雑なフォルダ構造のソースコードを検索することがよくあります。
cd /your/folder/
grep -rHino "your string"
これらのパラメータを使用すると、findを使用しなくても、ファイルのフルパスと指定された文字列を含む行番号が得られます。
これは、rHinoのように検索をBASHしてくれるので、覚えやすいです。)
これがどのように動作するか、簡単な例を挙げて説明します。
catを使ってファイルの内容を表示してみましょう。
jeeves ~ # cat fw.stop
#!/bin/sh
echo "Stopping firewall and allowing everyone..."
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
iptables -t mangle -F
iptables -t mangle -X
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT
そして、"iptables -P “という文字列を含むファイルを再帰的に検索してみましょう。
jeeves ~ # grep -rinHo "iptables -P"
fw.stop:9:iptables -P
fw.stop:10:iptables -P
fw.stop:11:iptables -P
出力を見ればわかるように、filename:hit row:searched string
使用したパラメータの詳細な説明は以下の通りです。
-r 各ディレクトリオペランドに対して、そのディレクトリ内のすべてのファイルを再帰的に読み込んで処理します。コマンドライン上のシンボリックリンクに従いますが、再帰的に遭遇したシンボリックリンクはスキップします。ファイルオペランドが与えられていない場合、grepは作業ディレクトリを検索することに注意してください。これは ‘–directories=recurse’ オプションと同じです。
-i 一致するごとにファイル名を表示します。これは、検索するファイルが複数ある場合のデフォルトです。
-n 出力の各行の先頭に、入力ファイル内の1を基準とした行番号を付けます。(-n は POSIX で指定)
-H 各マッチのファイル名を表示する。これは、検索するファイルが複数ある場合のデフォルトです。
-o マッチした行のマッチした(空でない)部分のみを表示します。出力行は入力と同じデリミタを使用し、-z (–null-data) が使用されている場合はデリミタはヌルバイトになります (その他のオプションを参照)。
Silver Searcher ](https://github.com/ggreer/the_silver_searcher) はファイルやコンテンツを検索するための非常に高速で便利なユーティリティです。
問題を解決するには、silver searcherコマンドは以下のようになります。
ag 'some string' -l
-l
一致するファイル名のみを表示する(一致する行は表示しない)