查找包含 2 个关键字的所有文件和/或路径的可靠方法是什么?

non*_*ity 1 ls grep bash find

我在做一个

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)

或者也许是另一种方式/更好的方式。

Gil*_*il' 6

您可以在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命令仅显示您可以访问的文件)。