fd 如何用 --and 组合多个必须同时满足的搜索条件?
2026/9/10 15:25:43 网站建设 项目流程

fd 如何用 --and 组合多个必须同时满足的搜索条件?

【免费下载链接】fdA simple, fast and user-friendly alternative to 'find'项目地址: https://gitcode.com/GitHub_Trending/fd/fd

在文件树里定位文件时,单个模式常常不够:你可能既要文件名包含foo、又要包含c、还要限定为目录。fd 的定位模式(pattern)默认使用正则表达式匹配文件名,而--and允许在此基础上追加一个或多个必须同时满足的模式。本文依据 fd 手册页 与仓库自带的 测试用例,说明如何编写这类多条件查询、如何与--type--extension--full-path等选项组合,以及如何验证结果、判断查询为什么失败。

--and的匹配规则

doc/fd.1 对--and的定义是:

  • 每个--and pattern都是必需的(required)搜索模式,所有模式必须全部匹配,结果才保留;
  • 可以指定多个--and,例如--and a --and b
  • 模式默认按正则表达式解析,除非命令使用了--glob--fixed-strings

另有一条容易忽略的规则:默认情况下,fd 只把模式与文件名(或目录名)比较。src/main.rs 中说明,不加--full-path时,主位置参数模式与每一个--and模式都以同样方式匹配文件名——所以任何--and模式里出现路径分隔符,和主模式写错一样,都无法命中。

编写多条件查询:从最小示例开始

以下命令都来自 fd 仓库的测试套件 tests/tests.rs,它们在固定的测试文件树上运行,下面的输出是测试中记录的示例结果,不是任意目录下的固定预期:

# 文件名同时包含 foo 与 c(fd 默认忽略大小写,除非模式含大写字符) fd foo --and c # 示例结果: # one/two/C.Foo2 # one/two/c.foo # one/two/three/directory_foo/ # 连续多个 --and:文件名含 f、含 a 或 d、含下划线 fd f --and '[ad]' --and '[_]' # 示例结果: # one/two/three/directory_foo/

几个可以直接复用的行为细节(同样出自测试用例):

# 模式含大写字符时触发 smart case(大小写敏感) fd Foo --and C # 示例结果:one/two/C.Foo2 # 某个条件永远匹配不到时,输出为空而不是报错 fd foo --and asdasdasdsadasd # 示例结果:(无输出) # 空字符串模式匹配所有条目,不影响其他条件 fd Foo --and 2 --and "" # 示例结果:one/two/C.Foo2

fd 的模式匹配使用正则语法,手册页的PATTERN SYNTAX一节将语法细节指向 Rust regex 库文档,测试中用到的字符类写法(如[ad][_][/\\]dir)可直接参考。

结合其他过滤选项

手册页说明「选项可以出现在命令行任意位置」,因此--and可与类型、扩展名、路径类选项自由组合:

# 与 --extension 组合:多个扩展名之间是“或”,--and 各模式之间是“且” fd A --and B --extension jpg --extension png # 示例结果: # A-B.jpg # B-A.png # 与 --type 组合:只保留目录 fd c --type d --and foo # 示例结果:one/two/three/directory_foo/ # 换成 --type f 则只返回文件(示例结果:one/two/C.Foo2、one/two/c.foo) # 与 --glob 组合:主模式和 --and 模式都按 glob 解析 fd '*foo' --glob --and 'c*' # 示例结果:one/two/c.foo # 与 --fixed-strings 组合:模式按字面字符串做子串匹配 fd foo --fixed-strings --and c --and . # 示例结果: # one/two/c.foo # one/two/C.Foo2 # 对照:字面匹配时 [c] 是普通字符,匹配不到任何条目 fd foo --fixed-strings --and '[c]' --and . # 示例结果:(无输出)

如果条件涉及路径而不只是文件名,需要加--full-path让模式针对完整路径匹配:

# 完整路径中含 _foo,且路径组件中含 dir fd three --full-path --and _foo --and '[/\\]dir' # 示例结果:one/two/three/directory_foo/ # 只约束路径组件(two 和 dir 两处都须出现) fd three --full-path --and '[/\\]two' --and '[/\\]dir' # 示例结果:one/two/three/directory_foo/

大小写行为可用-s/--case-sensitive-i/--ignore-case显式指定(默认为 smart case)。例如测试中fd Foo --ignore-case --and C --and '[.]'同时返回C.Foo2c.foo,而fd foo --case-sensitive --and c --and '[.]'只返回one/two/c.foo

另外,--and的值以-开头是合法的(如fd baz --and -),测试中已覆盖该写法。

验证结果与判断失败原因

完成查询后可以从三个层面核对:

  1. 直接比对输出。如果你在与测试环境相同的目录结构上运行(或在自己的目录树中按同样的条件人工核对),结果应与上文的示例结果一致;不一致时先检查条件是否全部保留。

  2. 脚本化判断有无结果。手册页的-q, --quiet(别名--has-results)让 fd 不打印任何内容:至少有一个结果时退出码为 0,否则为 1。它适合放进脚本,并且搜索在首个匹配后即可提前结束,比检查输出更快:

    fd foo --and c --quiet && echo "found"
  3. 区分“没找到”与“查询非法”,两者的现象不同:

    • 正则不合法:测试套件明确验证了任一模式(含--and模式)为未闭合的[时整条命令失败,例如fd Foo --and '[' --and 2 --and C会报错退出。此时不是“零结果”,而是命令没有成功运行。
    • 模式里混入了路径分隔符:src/main.rs 记录了这一诊断——不加--full-path时,主模式或任一--and模式包含/就永远无法匹配文件名,fd 会给出友好报错而不是静默返回空结果;测试中fd foo --and nonexistent/path即属于这种情况。正确做法是改用--full-path让模式匹配完整路径。

边界与限制

  • --and各模式之间是“且”关系;--extension--type等多值选项内部是“或”关系(如多个扩展名任取其一)。设计查询时注意这两层逻辑的区别。
  • 不加--full-path时,所有模式(主模式加全部--and模式)只与文件名比较;需要按路径组件设条件时务必显式加--full-path
  • 默认情况下 fd 会跳过隐藏文件/目录以及 gitignore、.ignore.fdignore规则命中的文件;若多条件查询“应该”命中某文件却没出现,需先确认该文件是否被这些默认忽略规则排除(手册页中对应--hidden--no-ignore等选项)。
  • --and模式等价于不增加约束,不要用它来“占位”;真正的过滤条件应写在非空模式中。

按以上路径,你可以把“多个必须同时满足的条件”写成一条fd 主模式 --and ... --and ...命令,用测试套件中的示例输出核对行为,并在脚本里用--quiet的退出码做自动化判断。更完整的选项列表(如--exclude-d-x)可继续在 doc/fd.1 中查阅。

【免费下载链接】fdA simple, fast and user-friendly alternative to 'find'项目地址: https://gitcode.com/GitHub_Trending/fd/fd

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询