bash构建查找选项列表

时间:2018-11-06 21:50:01

标签: arrays bash find

我正在尝试在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开头的文件。因此,只能找到CB_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*"

但是我不知道如何动态地做到这一点。

1 个答案:

答案 0 :(得分:3)

没有简单的方法可以在现有的数组内容前添加或附加单独的单词。您需要一个循环。

excludeOptions=()
for e in "${excludeArray[@]}"; do excludeOptions+=(! -name "$e*"); done