次のコードを作成しました。最後に、配列内の各ファイルを個別に処理したいが、このコードのどこかに二重引用符を含めないので、途中にスペースがあるファイル名は配列内の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
から、ヌルで終わるパス名を読み取る方法を知るツールを使用して読み取ることです。\0
nul 文字\0
は Unix パス名の一部にはできない唯一の文字なので、この文字を他のツールに渡す唯一の安全な方法です。
関連: