26

使用 Silver Searcher,我如何搜索:

  1. 带有单词或模式的(非二进制)文件AND
  2. 所有文件名,包含二进制文件的文件名的单词或模式。

其他偏好:希望进行不区分大小写的搜索和通过点文件进行搜索。


尝试使用此别名但运气不佳:

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

4

6 回答 6

55

根据手册页ag

   -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);

size上面的命令在所有匹配模式的文件中搜索单词cpio.c

参考:0.28.0 版
手册页ag

注1:

如果您在某些文件类型中查找字符串,比如说所有 C 源代码,其中有一个未记录的功能ag可以帮助您快速将搜索限制为某些文件类型。

下面的命令都foo在所有 php 文件中查找:

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

find + grep查找所有.php文件时,命令中的--php开关ag实际上会查找以下文件扩展名:

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

您可以--cpp用于 C++ 源文件、--hh文件.h--jsJavaScript 等。可以在此处找到完整列表

于 2015-01-20T22:22:41.867 回答
5

尝试这个:

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

该命令find .将列出所有文件。

我们将它的输出传递给 command ag "/.*SEARCHTERM[^/]*$",如果它在文件名中,它与 SEARCHTERM 匹配,而不仅仅是完整路径。

于 2013-12-18T01:04:27.730 回答
5

尝试将此添加到您的别名文件中。使用 zsh 进行测试,但应该使用 bash。您在示例中遇到的问题是 bash 别名不能接受参数,因此您必须首先定义一个函数以使用参数,然后将别名分配给该函数。

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

alias search=searchfunction

您可以通过几种方式修改此示例以适合您的目的,例如

  • -l根据您是否希望文本结果显示文本匹配或仅显示文件名来添加/删除标志
  • 添加标题以分隔文本结果和文件名结果
  • 去重结果以考虑在文件名和文本等方面都匹配的文件。

[编辑:根据 Pablo Bianchi 的评论删除了不必要的 --smart-case 标志]

于 2015-07-28T19:24:44.803 回答
4

发现这个问题自己寻找相同的答案。它似乎没有ag任何本机功能来搜索文件和目录名称。上面来自 Zach Fogg 和 Jikku Jose 的答案都有效,但是find .如果您在一个大目录中工作,管道可能会非常慢。

我建议find直接使用,这比通过管道快得多ag

Linux(GNU 版本find

find -name [pattern]

OSX(BSD 版本find

find [pattern]

如果您需要更多帮助find, Digital Ocean 的这份指南非常好。我包括这个是因为find如果你只是想弄清楚基本用法,手册页非常密集。

于 2014-10-15T21:23:54.533 回答
2

要添加到前面的答案,您可以使用“或”正则表达式在匹配不同文件扩展名的文件中进行搜索。

例如,仅在 C++ 头文件 [ .hpp ] 和 Makefiles [ .mk ] 中搜索字符串):

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

于 2019-01-04T17:39:12.983 回答
1

mdfind在对, find,和其他尝试不满意后locate,以下内容对我有用。它用于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 $
于 2019-04-18T20:01:07.993 回答