我正在寻找更好的发现。原因是 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):
更新(2014-11-23):
我强烈推荐Ag。它工作得很好。仍然有很多次 Find 是必要的,为此我继续寻找一个不错的替代品。虽然毫无疑问很有用,但在我看来,Find 的界面非常过时并且不必要地困难。
更新(2017-08-04):
我现在最强烈推荐ripgrep作为不可或缺的 Ag 替代品。这是一个非常新的工具,但它对 .gitignore 文件的支持大大超过了 Ag 并且在所有其他方面它是等效的或更好的。我继续寻找 Find 替代品。
更新(2021-11-28):