【问题标题】:bash build list of options for findbash 构建查找的选项列表
【发布时间】: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* 文件,而不是以 AC 开头的文件。所以只能找到B_foo_0B_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

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

【问题讨论】:

    标签: arrays bash find


    【解决方案1】:

    没有简单的方法可以将单独的单词全部添加到现有数组内容中。你需要一个循环。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-09
      • 1970-01-01
      • 1970-01-01
      • 2014-02-07
      相关资源
      最近更新 更多