【问题标题】:Best GNU Find Replacement最佳 GNU 查找替代品
【发布时间】:2012-05-25 00:28:51
【问题描述】:

我正在寻找更好的发现。原因是 find 用户界面对我来说不直观(特别是 pruning / -print 样式)并且由于对参数顺序的严格要求而难以包装在函数中。 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 是必要的,为此我继续寻找一个不错的替代品。虽然毫无疑问很有用,但在我看来,Find 的界面非常陈旧而且不必要地困难。

更新(2017-08-04):

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

更新(2021-11-28):

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

【问题讨论】:

  • 对参数排序的严格要求不是很清楚,因为您使用 -O3 调用 find 可能会以不同的顺序评估测试。
  • Xargs with Find 有点用,但我使用来自 Perl 的 File::Find。
  • 请举例说明find 不适合您。我看不出用 adhoc 替换一个正常工作的、标准的、众所周知的 GNU util 的意义。
  • @C2H5OH,与除索引以外的所有方式查找相比,定位实际上非常原始。 Locate 不维护很多关键文件属性,例如类型、时间戳、权限和所有者。 find 也有很多非常好的函数来操作文件, locate 需要额外的 xargs sh 调用和相当多的脚本来支持。我正在寻找替代品,而不是想写一个:)
  • 条件复杂时,条件复杂。在这组 工具中,您会发现能够很好​​且简单地处理特定复杂条件子集的工具,以及灵活但需要配置和理解复杂性的工具。你不能一边吃蛋糕一边吃。

标签: find command-line-interface ack ag ripgrep


【解决方案1】:

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

【讨论】:

  • 看起来很整洁。我会尝试并跟进。
  • 自从尝试了 Ack,我意识到我真正想要的是具有不同 UI 的 Find。也就是说,我发现 Ack 是满足我大部分需求的有用替代方案。
  • 我最近从 Ack 切换到 Ag (github.com/ggreer/the_silver_searcher),这似乎要快一些。
猜你喜欢
  • 2011-04-08
  • 2011-03-14
  • 1970-01-01
  • 2013-08-01
  • 2019-05-29
  • 2010-10-06
  • 2010-12-07
  • 2010-09-29
  • 1970-01-01
相关资源
最近更新 更多