最佳 GNU 查找替代品

Ste*_*ski 5 find command-line-interface ack ag ripgrep

我正在寻找更好的发现。原因是查找用户界面对我来说不直观(特别是修剪/打印样式),并且由于对参数排序的严格要求而难以包装在函数中。locate/updatedb 不够灵活,无法使用。有人愿意分享他们的示例查找包装器或查找替代方案(请仅使用命令行)吗?

这是我认为不直观的用法的示例:

find dir_a dir_b \( -path dir_a/.git -o -path dir_b/out \) -prune -o \( -type f -o -type l \)
Run Code Online (Sandbox Code Playgroud)

在选项之前指定目录对我来说很奇怪,而且修剪的语法很容易被忘记。(有些程序使用 --exclude 选项代替。)我认识到这是一个挑剔的点。

这是我在不损失太多功能的情况下指定一些默认值的最佳尝试:

f()
{
  # The trouble is that -regextype must appear after path but before expression.
  # HACK: "-D debugopts" unsupported and -[HLPO] options assumed to before dirs.
  local a=()
  while [[ -n "$1" ]] && ( [[ ! "${1:0:1}" =~ [-!(),] ]] || [[ "${1:0:2}" =~ -[HLPO] ]] )
  do
    a+=("$1")

    # Eliminate arg from @.
    shift
  done

  find -O3 "${a[@]}" -nowarn -regextype egrep "$@"
}
Run Code Online (Sandbox Code Playgroud)

要求完美理解程序中的所有选项,以便能够用一些默认值来包装它,并且不会失去与普通查找的功能/兼容性,这似乎很愚蠢。

我猜我不会对任何像 GNU 发现的那样标准的东西进行罚款,但可能会有更好的东西,尽管不太为人所知。

更新(2013-11-26):

  • 在 Itay 的建议下,我使用了ack大约一年。它对于我至少 95% 的搜索都非常有效。
  • 我最近发现了Ag,它是 ack 的快速版本。过去几周一直运作良好。

更新(2014-11-23):

我强烈推荐Ag。效果很好。很多时候 Find 仍然是必要的,为此我继续寻找一个不错的替代品。尽管毫无疑问很有用,但 Find 的界面非常过时,而且在我看来也不必要地困难。

更新(2017-08-04):

我现在强烈推荐ripgrep作为不可或缺的 Ag 替代品。这是一个非常新的工具,但它对 .gitignore 文件的支持大大超过了 Ag,并且在所有其他方面它是等效的或更好的。我继续寻找替代品。

更新(2021-11-28):

我继续使用并喜欢ripgrep,它可以满足我的大部分需求。对于其他所有内容,我混合使用 find 和fd

小智 2

您应该尝试Ackfind ,它是和的替代品grep,针对源代码树的使用进行了优化。