0

我正在尝试将 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!
4

2 回答 2

1

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

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

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

注意两个<字符之间的空格!

于 2012-10-21T10:19:13.653 回答
0

问题出在这里

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
于 2012-10-21T10:31:59.243 回答