搜索文件&使用银色搜索器的文件名

时间:2013-09-10 07:49:00

标签: command-line terminal grep command-line-interface ack

使用Silver Searcher,我该如何搜索:

  1. (非二进制)文件,带有单词或模式 AND
  2. 所有文件名,包含包含二进制文件文件名的字或图案。
  3. 其他偏好:希望通过点文件进行不区分大小写的搜索和搜索。


    尝试使用此别名而没有太多运气:

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

6 个答案:

答案 0 :(得分:46)

根据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

参考:
ag版本0.28.0

的手册页

注1:

如果您要查找某些文件类型中的字符串,例如所有C源代码,ag中有undocumented feature可帮助您快速将搜索限制为某些文件类型。

以下命令都在所有php文件中查找foo

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

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

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

您可以将--cpp用于C ++源文件,--hh用于.h个文件,--js用于JavaScript等等。可以找到完整列表here

答案 1 :(得分:5)

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

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

alias search=searchfunction

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

  • 添加/删除-l标记取决于您是否希望文本结果显示文本匹配或仅显示文件名
  • 添加标题以分隔文本结果和文件名结果
  • 重复数据删除结果以考虑与文件名和文本等相匹配的文件

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

答案 2 :(得分:4)

试试这个:

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

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

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

答案 3 :(得分:4)

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

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

Linux(find的GNU版本)

find -name [pattern]

OSX(find的BSD版本)

find [pattern]

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

答案 4 :(得分:0)

要添加到先前的答案中,您可以使用"Or" Regular Expression在与不同文件扩展名匹配的文件中进行搜索。

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

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

答案 5 :(得分:0)

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 $