我当时正在做一个
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
可能会明显更快。
如果您经常这样做,您可以将其设为一个函数(将其放在您的~/.kshrc
or~/.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
命令仅显示您可以访问的文件)。