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
相关产品推荐
相关产品推荐

