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[@]}")

2つの文字の間のスペースに注意してください<

于 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 に答える