我正在尝试在bash
的{{1}}数组中构建选项列表,以查找某些文件。考虑包含以下文件的目录:
find
我的脚本以编程方式确定了{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
个文件,而不是以*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*"
现在,如果我回应的话,它看起来还不错:
excludeOptions=( "${excludeArray[@]/%/\*\"}" ) # Append *" to each element
excludeOptions=("${excludeOptions[@]/#/ ! -name \"}") # Prepend ! -name " to each element
但是当我尝试将它与find结合使用时,会得到以下信息:
echo "${excludeOptions[@]}"
! -name "A*" ! -name "C*"
打开调试模式表明该问题可能是由于元素的引用引起的:
$ 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*"
但是我不知道如何动态地做到这一点。
答案 0 :(得分:3)
没有简单的方法可以在现有的数组内容前添加或附加单独的单词。您需要一个循环。
excludeOptions=()
for e in "${excludeArray[@]}"; do excludeOptions+=(! -name "$e*"); done