最好的GNU查找替换

时间:2012-05-25 00:28:51

标签: 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 \)

在选项之前指定目录对我来说很奇怪,很容易忘记修剪的语法。 (有些程序使用--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 "$@"
}

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

我猜我不会像GNU发现的那样标准化,但可能有更好的东西,尽管鲜为人知。

更新(2013-11-26):

  • 在Itay的建议中,我使用了ack大约一年。它至少可以在95%的搜索中使用。
  • 我最近发现Ag,这是ack的快速版本。它在过去几周一直运作良好。

更新(2014-11-23):

我强烈推荐Ag。它很棒。仍有很多次查找是必要的,为此我继续寻求一个很好的替代品。虽然无疑是有用的,但Find的界面非常过时,在我看来也不必要。

更新(2017-08-04):

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

1 个答案:

答案 0 :(得分:2)

您应该尝试Ack,这是findgrep的替代品,已针对使用源代码树进行了优化。