Command line 搜索文件&;使用silver searcher的文件名
使用Silver Searcher,我如何搜索:Command line 搜索文件&;使用silver searcher的文件名,command-line,terminal,grep,command-line-interface,ack,Command Line,Terminal,Grep,Command Line Interface,Ack,使用Silver Searcher,我如何搜索: (非二进制)具有单词或模式和 所有文件名,带有包含二进制文件文件名的单词或模式 其他首选项:希望使用不区分大小写的搜索和通过dotfiles进行搜索 尝试使用此别名时运气不佳: alias search=“ag-g$1--智能案例--隐藏&ag--智能案例--隐藏$1”尝试以下操作: find . | ag "/.*SEARCHTERM[^/]*$" 命令find.将列出所有文件 我们通过管道将其输出到命令ag/.*SEARCHTERM[^/
尝试使用此别名时运气不佳:
alias search=“ag-g$1--智能案例--隐藏&ag--智能案例--隐藏$1”
尝试以下操作:
find . | ag "/.*SEARCHTERM[^/]*$"
命令find.
将列出所有文件
我们通过管道将其输出到命令
ag/.*SEARCHTERM[^/]*$”
,该命令与文件名中的SEARCHTERM匹配,而不仅仅是完整路径。我自己发现了这个问题,正在寻找相同的答案。似乎ag
没有搜索文件名和目录名的本地功能。上面来自扎克·福克和吉库·何塞的答案都有效,但是如果你在一个大目录中工作,那么管道find.
可能会非常慢
我建议直接使用find
,这比通过ag
管道传输要快得多:
Linux(GNU版本的find
)
OSX(BSD版本的find
)
如果您需要有关
查找
的更多帮助,请访问Digital Ocean。我之所以包括这一点,是因为如果您只想了解基本用法,find
的手册页非常密集。根据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
参考资料:ag
0.28.0版手册页
注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 < />代码>文件>代码> -JS>代码> JavaScript等。使用zsh进行测试,但应使用bash。您在示例中遇到的问题是bash别名不能接受参数,因此必须首先定义一个函数来使用参数,然后将别名分配给该函数
searchfunction() {
echo $(ag -g $1 --hidden)
echo $(ag --hidden -l $1)
}
alias search=searchfunction
您可以通过几种方式修改此示例以满足您的目的,例如
- 根据是否希望文本结果显示文本匹配或仅显示文件名,添加/删除
标志-l
- 添加标题以分隔文本结果和文件名结果
- 重复数据消除结果以说明文件名和文本等匹配的文件
[编辑:根据Pablo Bianchi的评论删除不必要的--智能案例标志]要添加到前面的答案中,您可以使用在匹配不同文件扩展名的文件中进行搜索
例如,在C++头文件中搜索字符串[<强> Hpp]和MaxFrime[<强> MK<强S>):
ag-G.*\(hpp | mk)'my_string_to_search
在对mdfind
、find
、locate
和其他尝试感到不满意后,以下几点对我有效。它使用tree
获取文件的初始列表,ag
过滤出目录,然后awk
打印匹配的文件本身
我最终使用了tree
,因为它比我尝试的其他解决方案更易于配置,而且速度更快
这是一个fish函数:
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 $
几乎用一个更简单的解决方案解决了一个变体:ag-gag“搜索词”;是的,你的模式可以用来过滤文件名而不是路径。谢谢你的帮助confirming@JikkuJose你会将此作为一个可接受的答案删除吗?回顾过去,鉴于
ag
@Greg fyi提供的-g
和-g
标志,这显然是不正确的,-g
是一个输出选项nice,不确定我在提交原始答案时是如何遗漏了-g
和-g
。OP的措辞有些混乱,但我认为他想要的是运行一个命令来搜索所有文件名以及非二进制文件内容。似乎ag-g[search]&&ag-l[search]
会起作用。我想这是一个更好的答案,我应该标记这个答案?有什么想法吗?@JikkuJose我补充了一个新的答案,我相信它解决了你原来的问题completely@JikkuJose我认为社区一致认为这是对你的问题的一个更好的回答。-g
也应该在你的答案中占有一席之地。有没有办法将其调整为与“sack/sag”()一起使用?这需要将两个ag查询合并为一个,这样sack所依赖的第一个命令的搜索缓存就不会被破坏。您可以省略一个参数:-S——如果模式中有大写字母,请区分大小写,否则不区分大小写。默认启用。@PabloBianchi谢谢。我有一个(非常)旧版本的ag,它的手册页没有“默认启用”注释,但经过测试,似乎甚至旧版本的ag在默认情况下也确实使用了这个标志。更新了我的答案。如何让它在新行上输出每个结果?如果您在bash中使用该别名,应该注意这一点。
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 $