You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Bash中如何为find命令以数组形式传递选项?

解决find命令中使用数组传递排除条件的问题

问题出在你把整个排除条件块当成了数组的单个元素,而find命令要求每个语法单元(比如-not、(、-name、目标文件名、-prune、))都作为独立的命令行参数。当你把整个字符串作为一个元素传递时,find会把它识别成一个不存在的谓词,自然报错。

正确的数组定义方式

你需要将每个独立的find参数拆分为数组的单独元素。这里有两种可行的写法:

# 方式1:用单引号包裹括号(避免bash将括号解析为子shell语法)
findExclusions=(
    -not '(' -name '#recycle' -prune ')'
    -not '(' -name '#snapshot' -prune ')'
    -not '(' -name '@eaDir' -prune ')'
    -not '(' -name '.TemporaryItems' -prune ')'
)

# 方式2:转义括号(通过反斜杠告诉bash这是普通字符)
findExclusions=(
    -not \( -name '#recycle' -prune \)
    -not \( -name '#snapshot' -prune \)
    -not \( -name '@eaDir' -prune \)
    -not \( -name '.TemporaryItems' -prune \)
)

这两种写法都会让bash将find需要的每个参数拆分为独立的数组元素(比如-not、(、-name、#recycle等),传递给find时就能被正确解析。

执行命令

现在你可以正常运行你的find命令了:

LC_ALL=C /bin/find src -mindepth 1 "${findExclusions[@]}" -print

为什么之前的写法不行

举个例子,你之前的数组元素"-not \( -name '#recycle' -prune \)"会被bash作为一个完整的字符串传递给find,find收到的是一个参数-not \( -name '#recycle' -prune \),它会尝试把这个字符串当成一个谓词来解析,而find根本没有这样的谓词,所以就会抛出unknown predicate的错误。拆分参数后,find会逐个解析每个参数,就能正确识别你的排除逻辑。

内容的提问来源于stack exchange,提问作者TylerDurden

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 09:00:38