【问题标题】:Bash Scripting: Output of find command with quoted variable to an arrayBash 脚本:将带有引号变量的 find 命令输出到数组
【发布时间】:2012-10-21 18:31:59
【问题描述】:

我正在尝试将 find 命令的输出存储到数组中。

我尝试了不同的方法,但似乎没有任何效果,其中一些在下面的注释行中。我想问题在于 "${findNameCmdSubDir[@]}" 正在被标记化,并且打算从搜索中排除的目录被忽略,并且所有目录都被列出。

如果我给出 find 命令而不将其传递给数组,即普通的 find 命令,我会看到列出所有其他目录但不包含排除项的预期输出。

#! /bin/bash
android_path=$1
excludeDirFromSearch=( doc build test unit-test script hardware prebuilt device . )
let "dirCount = 0"

findNameCmdSubDir=()
for dir in "${excludeDirFromSearch[@]}"; do
    if [ $((dirCount++)) -eq ${#excludeDirFromSearch[@]} ]; then
            findNameCmdSubDir+=(-name "${dir}*")
    else
            findNameCmdSubDir+=(-name "${dir}*" -prune -o)
    fi
done

searchSubDirectories=()
searchSubDirectories=( $(find "${android_path}" -mindepth 1 -maxdepth 1 \
"${findNameCmdSubDir[@]}" -type d ) ) <<-- Not Working!
#find "${android_path}" -mindepth 1 -maxdepth 1 "${findNameCmdSubDir[@]}" \
#    -type d | while read line; do
#        echo "$line"
#done  <-- Not working
find "${android_path}" -mindepth 1 -maxdepth 1 "${findNameCmdSubDir[@]}" \
    -type d -print <-- works as expected !

echo "${searchSubDirectories[@]}"

更新

我尝试转义双引号,但仍然没有成功

searchSubDirectories=( $(find "${android_path}" -mindepth 1 -maxdepth 1 \"${findNameCmdSubDir[@]}\" -type d ) ) <<-- Not Working!

【问题讨论】:

    标签: bash shell


    【解决方案1】:

    定义“不工作”。您期望/想要达到的结果是什么?实际效果如何?

    如果find 打印带有空格的路径并且您想将它们放入一个新数组中,请尝试使用process substitution 而不是command substitution

    findopts="-mindepth 1 -maxdepth 1 -type d"
    ...
    searchSubDirectories=()
    while read dir; do
      searchSubDirectories+=("$dir")
    done < <(find "${android_path}" $findopts "${findNameCmdSubDir[@]}")
    

    注意两个&lt; 字符之间的空格!

    【讨论】:

      【解决方案2】:

      问题出在这里

      searchSubDirectories=( $(find "${android_path}" -mindepth 1 -maxdepth 1 \
      "${findNameCmdSubDir[@]}" -type d ) )
      

      最后你缺少-print


      另外,关于这个区块

      for dir in "${excludeDirFromSearch[@]}"; do
          if [ $((dirCount++)) -eq ${#excludeDirFromSearch[@]} ]; then
                  findNameCmdSubDir+=(-name "${dir}*")
          else
                  findNameCmdSubDir+=(-name "${dir}*" -prune -o)
          fi
      done
      

      摆脱这个

      if [ $((dirCount++)) -eq ${#excludeDirFromSearch[@]} ]; then
                  findNameCmdSubDir+=(-name "${dir}*")
      

      你不需要它。对于所有排除的目录,您都需要-prune -o,即您完成的命令字符串应该具有这种形式

          find -name EXCLUDE1 -prune -o -name EXCLUDE2 -prune -o -type d -print 
      

      将此与您的想法进行比较(这不会按您的预期工作)

          find -name EXCLUDE1 -prune -o -name EXCLUDE2 -prune -type d
      

      【讨论】:

      • 缺少的-print 与问题无关。见find(1)如果没有给出表达式,则使用表达式-print
      猜你喜欢
      • 1970-01-01
      • 2015-06-17
      • 2012-04-03
      • 2016-01-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多