我可以有效地限制找到给我的匹配数量吗?

Can I efficiently limit the number of matches find gives me?

本文关键字:我的 有效地 我可以      更新时间:2023-10-16

我正在将查找应用于包含数万个文件的大型目录树,以查找具有特定名称的所有csv文件,作为面向内部用户的应用程序的一部分。

查找/path/to/dirs -name filename.ext | head -n 100

这需要相当长的时间(在某些情况下长达一分钟),我怀疑只找到前 100 个匹配项(如果没有,则更少)并返回这些匹配项会快得多。这是否可能在不将输出管道到头部的情况下使用 find(这需要查找所有匹配项)?我在info页面中没有看到任何引起我注意的选项。如果没有(正如我怀疑的那样),还有其他 unix 工具已经这样做了吗?

或者,如何将罗塞塔代码中的此代码修改为此类工具?

#include "boost/filesystem.hpp"
#include "boost/regex.hpp"
#include <iostream>
using namespace boost::filesystem;
int main()
{
  path current_dir("."); //
  boost::regex pattern("a.*"); // list all files starting with a
  for (recursive_directory_iterator iter(current_dir), end;
       iter != end;
       ++iter)
  {
    std::string name = iter->path().filename().string();
    if (regex_match(name, pattern))
      std::cout << iter->path() << "n";
  }
}

我必须承认我不是一个C++程序员,但我怀疑这段代码可以很容易地被修改成一个 shell 工具的人,该工具接受一个path参数、一个filename参数和一个max参数,并在目录 path 下打印最多max名为 filename 的文件的完整文件路径。

虽然我不是一个C++程序员,但我今天确实写了一个UNIX工具(在Racket中)来做到这一点。稍后我将尝试发布一些基准测试以将其与find进行比较。

Q. "这是否可能在不将输出管道到头部的情况下进行查找(这需要查找所有匹配项)"

这是错误的。当head满意时,它结束,关闭管道。 find将以 SIGPIPE (13) 退出,因此不需要查找所有匹配项