web-dev-qa-db-ja.com

シルバーサーチャーを使用してファイルとファイル名を検索する

Silver Searcherを使用して、どのように検索できますか?

  1. Wordまたはパターンの(非バイナリ)ファイル[〜#〜] and [〜#〜]
  2. すべてfilenames、Wordまたはバイナリファイルのファイル名を含むパターン。

その他の設定:大文字と小文字を区別せずに検索し、ドットファイルを検索したいとします。


あまり運のないこれを使用してエイリアスを試しました:

alias search="ag -g $1 --smart-case --hidden && ag --smart-case --hidden $1"

23
Jikku Jose

agのmanページによると

   -G --file-search-regex PATTERN
          Only search files whose names match PATTERN.

-Gオプションを使用して、パターンに一致するファイルを検索できます。

だから、あなたの質問に答えるには:

root@Apache107:~/rpm-4.12.0.1# ag -G cpio.c size
rpm2cpio.c
21:    off_t payload_size;
73:    /* Retrieve payload size and compression type. */
76:     payload_size = headerGetNumber(h, RPMTAG_LONGARCHIVESIZE);

上記のコマンドは、パターンcpio.cに一致するすべてのファイルでWord sizeを検索します

参照:
agバージョン0.28.0のmanページ

注1:

特定のファイルタイプ、たとえばすべてのCソースコードで文字列を検索する場合、agドキュメント化されていない機能 があり、検索を特定のファイルタイプにすばやく制限できます。

以下のコマンドは両方とも、すべてのphpファイルでfooを探します。

find . -name \*.php -exec grep foo {}
ag --php foo

find + grepはすべての.phpファイルを検索しますが、agコマンドの--phpスイッチは実際には次のファイル拡張子を検索します。

.php  .phpt  .php3  .php4  .php5  .phtml

C++ソースファイルの場合は--cpp--hhファイルの場合は.h、JavaScriptの場合は--jsなどを使用できます。完全なリストは こちら で確認できます。

49
vincentleest

これを試して:

find . | ag "/.*SEARCHTERM[^/]*$"

コマンドfind .はすべてのファイルをリストします。

その出力をコマンドag "/.*SEARCHTERM[^/]*$"にパイプします。これは、フルパスだけでなく、ファイル名に含まれている場合はSEARCHTERMに一致します。

5
Zachary Fogg

これをエイリアスファイルに追加してみてください。 zshでテストされていますが、bashで動作するはずです。この例で発生した問題は、bashエイリアスがパラメーターを取得できないことです。そのため、最初にパラメーターを使用する関数を定義し、次にその関数にエイリアスを割り当てる必要があります。

searchfunction() {
  echo $(ag -g $1 --hidden)
  echo $(ag --hidden -l $1)
}

alias search=searchfunction

この例は、いくつかの方法で目的に合わせて変更できます。

  • テキスト結果にテキストの一致またはファイル名のみを表示するかどうかに応じて、-lフラグを追加/削除します
  • ヘッダーを追加して、テキスト結果とファイル名結果を分離する
  • ファイル名とテキストの両方で一致するファイルなどを考慮して結果を重複排除する.

[編集:Pablo Bianchiのコメントに従って不要な--smart-caseフラグを削除]

5
Greg

私自身も同じ答えを探しているこの質問を見つけました。 agには、ファイル名とディレクトリ名を検索するネイティブ機能がないようです。上記のZach FoggとJikku Joseの回答はどちらも機能しますが、パイピングfind .大きなディレクトリで作業している場合、非常に遅くなる可能性があります。

findを直接使用することをお勧めします。これは、agをパイプするよりもはるかに高速です。

Linux(findのGNUバージョン)

find -name [pattern]

OSX(findのBSDバージョン)

find [pattern]

findについてさらにヘルプが必要な場合は、デジタルオーシャンの このガイド が最適です。 findのmanページは、基本的な使用法を理解したいだけでは途方もなく密集しているので、これを含めます。

4
Greg

以前の回答に追加するには、 "または"正規表現 を使用して、異なるファイル拡張子に一致するファイル内を検索できます。

たとえば、C++ヘッダーファイル[。hpp]およびMakefiles [。mk]):

ag -G '.*\.(hpp|mk)' my_string_to_search

1
djondal

mdfindfindlocate、およびその他の試みに満足できなかった後、次の方法でうまくいきました。 treeを使用してファイルの初期リストを取得し、agを使用してディレクトリをフィルターで除外し、次にawkを使用して一致するファイル自体を出力します。

treeを使用したのは、他のソリューションよりも(そして簡単に)構成可能であり、高速であるためです。

これは魚の機能です:

function ff --description 'Find files matching given string'
  tree . --Prune --matchdirs -P "*$argv*" -I "webpack" -i -f --ignore-case -p |
    ag '\[[^d].*' |
    awk '{print $2}'
end

これにより、次のような出力が得られます。

~/temp/hello_world $ ff controller
./app/controllers/application_controller.rb
./config/initializers/application_controller_renderer.rb
~/temp/hello_world $
1
jchilders