【发布时间】:2018-11-07 05:56:03
【问题描述】:
我正在尝试在bash 数组中为find 构建选项列表以查找某些文件。考虑一个包含以下文件的目录:
A_foo_0
A_foo_1
A_bar_0
B_foo_0
B_foo_1
B_bar_0
C_foo_0
C_foo_1
C_bar_0
我的脚本以编程方式确定应该通过 find 找到 *foo* 文件,而不是以 A 或 C 开头的文件。所以只能找到B_foo_0 和B_foo_1,如下手动调用find 所示:
$ find ./ -name "*foo*" ! -name "A*" ! -name "C*"
./B_foo_1
./B_foo_0
但是我需要学习要动态排除的前缀,所以我有一个数组来定义应该排除哪些前缀:
declare -a excludeArray
excludeArray+=(A)
excludeArray+=(C)
我想把它变成有效的! -name "A*" and ! -name "C*" 并将它传递给 find,像这样:
excludeOptions=( "${excludeArray[@]/%/\*\"}" ) # Append *" to each element
excludeOptions=("${excludeOptions[@]/#/ ! -name \"}") # Prepend ! -name " to each element
现在,如果我附和它,它看起来很不错:
echo "${excludeOptions[@]}"
! -name "A*" ! -name "C*"
但是当我尝试将它与 find 一起使用时,我得到以下信息:
$ find ./ -name "*foo*" "${excludeOptions[@]}"
find: paths must precede expression: ! -name "A*"
开启调试模式显示问题很可能是引用元素引起的:
$ set -x
$ find ./ -name "*foo*" "${excludeOptions[@]}"
+ find ./ -name '*foo*' ' ! -name "A*"' ' ! -name "C*"'
find: paths must precede expression: ! -name "A*"
$ find ./ -name "*foo*" ${excludeOptions[@]}
+ find ./ -name '*foo*' ' ! -name "A*"' ' ! -name "C*"'
find: paths must precede expression: ! -name "A*"
如果我像下面这样构建数组,它可以工作:
$ excludeOptions=( ! -name "A*" ! -name "C*")
$ find ./ -name "*foo*" "${excludeOptions[@]}"
+ find ./ -name '*foo*' '!' -name 'A*' '!' -name 'C*'
./B_foo_1
./B_foo_0
但我不知道如何动态地做到这一点。
【问题讨论】: