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

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

我当时正在做一个

find . -iname '*sitesearch*' | grep demo

因为我知道该文件应该是some/path/SiteSearch/demo/SiteSearch.html,但结果有人将文件放入 as some/path/SiteSearch/demo/index.html,所以找不到该文件。

有没有更好的方法来进行搜索?

比如对于这个例子,如果我这样做

find . -iname '*demo*' | grep -i sitesearch

它会找到它的。但我不想总是思考它是什么可能性并弄清楚要使用什么模式。我只是想要一种方法,每当文件和路径同时具有这两个关键字时,然后将其打印出来。例如,如果有一种方法可以为ls所有文件提供每一行的完整路径,那么我们可以这样做

ls --some-flags | grep -i demo | grep -i sitesearch

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

答案1

您可以在 中组合两个模式(或更普遍的是多个条件)find

find . -ipath '*sitesearch*' -ipath '*demo*'

或者如果您更喜欢正则表达式语法

find . -iregex '.*sitesearch.*' -iregex '.*demo.*'

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[@]}"
}

另请注意,您可以使用以下命令按名称搜索文件locate(检查您系统上的手册页,因为即使在 Linux 上也有多种实现)。

locate -i sitesearch | grep -i demo

这比查找大型目录树更快,因为locate查询索引(尽管不区分大小写的搜索往往不会那么快)。但是,索引通常仅在每晚重建,因此它不会显示今天创建的文件。不在公共可读目录中的文件可能会也可能不会被索引,具体取决于实现(检查是否/usr/bin/locate是 setuid 根二进制文件:如果是,则私有文件会被索引,并且该locate命令仅显示您可以访问的文件)。

相关内容