我在做一个
find . -iname '*sitesearch*' | grep demo
Run Code Online (Sandbox Code Playgroud)
因为我知道文件应该是some/path/SiteSearch/demo/SiteSearch.html,但结果是有人把文件放在 as 中some/path/SiteSearch/demo/index.html,所以找不到文件。
有没有更好的方法来进行搜索?
例如对于这种情况,如果我这样做
find . -iname '*demo*' | grep -i sitesearch
Run Code Online (Sandbox Code Playgroud)
它会找到它的。但我不想总是想它是什么可能性并弄清楚要使用什么模式。我只想要一种方法,当文件和路径同时具有这两个关键字时,然后将其打印出来。例如,如果有一种方法将ls所有文件都放在每一行的完整路径,那么我们可以这样做
ls --some-flags | grep -i demo | grep -i sitesearch
Run Code Online (Sandbox Code Playgroud)
或者也许是另一种方式/更好的方式。
您可以在find.
find . -ipath '*sitesearch*' -ipath '*demo*'
Run Code Online (Sandbox Code Playgroud)
或者如果您更喜欢正则表达式语法
find . -iregex '.*sitesearch.*' -iregex '.*demo.*'
Run Code Online (Sandbox Code Playgroud)
“ls每行都有完整路径”(加上递归遍历目录,这里显然需要)将是find. 虽然您可以运行find | grep -i demo | grep -i sitesearch,但全部使用find可能会明显更快。
如果你经常这样做,你可以把它变成一个函数(把它放在你的~/.kshrcor~/.bashrc或 中~/.zshrc):
findallof () {
typeset -a pred
pred=(.)
typeset x
for x do
pred=("${pred[@]}" -ipath "*$x*")
done
find "${pred[@]}"
}
Run Code Online (Sandbox Code Playgroud)
另请注意,您可以按名称搜索文件locate(检查系统上的手册页,因为即使在 Linux 上也有多种实现)。
locate -i sitesearch | grep -i demo
Run Code Online (Sandbox Code Playgroud)
这可能比查看大型目录树更快,因为locate查询索引(尽管不区分大小写的搜索往往不会那么快)。但是,索引通常只在每晚重建,因此它不会显示今天创建的文件。不在公共可读目录中的文件可能会或可能不会被索引,具体取决于实现(检查是否/usr/bin/locate是 setuid 根二进制文件:如果是,私有文件被索引并且locate命令仅显示您可以访问的文件)。