配列に追加されたコマンドの結果を見つけるために繰り返しますか?スペースを含むファイル名は2つの項目として扱われます。

配列に追加されたコマンドの結果を見つけるために繰り返しますか?スペースを含むファイル名は2つの項目として扱われます。

次のコードを作成しました。最後に、配列内の各ファイルを個別に処理したいが、このコードのどこかに二重引用符を含めないので、途中にスペースがあるファイル名は配列内の2つの項目として扱われます。

#!/bin/bash

EXT=(sh mkv txt)

EXT_OPTS=()
# Now build the find command from the array
for i in "${EXT[@]}"; do
    EXT_OPTS+=( -o -iname "*.$i" )
done

# remove the first thing in EXT_OPTS
EXT_OPTS=( "${EXT_OPTS[@]:1}" )

# Modify to add things to ignore:
EXT_OPTS=( '(' "${EXT_OPTS[@]}" ')' ! '(' -iname "*test*" -o -iname "*sample*" ')' )

#echo "${EXT_OPTS[@]}"

searchResults=($(find . -type f "${EXT_OPTS[@]}"))

#echo "$searchResults"

for R in "${searchResults[@]}"; do
    echo "$R"
    sleep 1
done

だから私が得た結果は次のとおりです。

./Find2.sh
./untitled
2.sh
./countFiles.sh
./unrar.sh
./untitled
3.sh
./untitled
4.sh
./clearRAM.sh
./bash_test.sh
./Test_Log.txt
./untitled.txt
./Find.txt
./findTestscript.sh
./untitled.sh
./unrarTest.sh
./Test.sh
./Find.sh
./Test_Log
copy.txt
./untitled
5.sh
./IF2.sh

たとえば、Untitled5.shは2つの項目として配列に追加されました。 「sを追加するのはどこで忘れましたか?

乾杯

提案された修正:

#!/bin/bash

EXT=(sh mkv txt)

EXT_OPTS=()
# Now build the find command from the array
for i in "${EXT[@]}"; do
    EXT_OPTS+=( -o -iname "*.$i" )
done

# remove the first thing in EXT_OPTS
EXT_OPTS=( "${EXT_OPTS[@]:1}" )

# Modify to add things to ignore:
#EXT_OPTS=( "${EXT_OPTS[@]:-1}" )
EXT_OPTS=( '(' "${EXT_OPTS[@]}" ')' ! '(' -iname "*x0r*" -o -iname "*torrent*" ')' )

#echo "${EXT_OPTS[@]}"

#searchResults=($(find . -type f "${EXT_OPTS[@]}"))

#echo "$searchResults"

#for R in "${searchResults[@]}"; do
#   echo "$R"
#   sleep 1
#done


find . -type f "${EXT_OPTS[@]}" -exec sh -c '
    for pathname do
        printf "%s\n" "$pathname"
        sleep 1
    done' sh {} +

現在生産中:

./Find2.sh
./untitled 2.sh
./countFiles.sh
./unrar.sh
./untitled 3.sh
./Find3.sh
./untitled 4.sh
./clearRAM.sh
./bash_test.sh
./Test_Log.txt
./untitled.txt
./Find.txt
./findTestscript.sh
./untitled.sh
./unrarTest.sh
./Test.sh
./Find.sh
./Test_Log copy.txt
./untitled 5.sh
./IF2.sh
./Find4.sh

ベストアンサー1

いいえ、出力を解析しないでくださいfind。見つかったパス名で操作を実行するには、find次の中で行う必要がありますfind

find ...stuff... -exec sh -c '
    for pathname do
        printf "%s\n" "$pathname"
        sleep 1
    done' sh {} +

ここではfind、一括検出されたパス名を使用してインラインシェルスクリプトを呼び出します(スクリプトは複数回呼び出すことができます)。find内部スクリプトのパス名ジェネレータとして機能します。

別のアプローチは、出力に中間パス名を使用して-print0から、ヌルで終わるパス名を読み取る方法を知るツールを使用して読み取ることです。\0nul 文字\0は Unix パス名の一部にはできない唯一の文字なので、この文字を他のツールに渡す唯一の安全な方法です。

関連:

おすすめ記事