find コマンドから bash for ループ内の項目を参照する

find コマンドから bash for ループ内の項目を参照する

次のようなコードがあるとします:

for i in $(find * -type f -name "*.txt"); do 
  # echo [element by it's index]
done

可能であれば、インデックスによって要素にアクセスするにはどうすればよいですか?

答え1

あなたの命令

$(find * -type f -name "*.txt")

配列ではなく、(スペースで区切られた) bash リストを返すため、個々の要素に「ターゲットを絞った」方法でアクセスすることはできません。

これをbash配列に変換するには、

filearray=( $(find * -type f -name "*.txt") )

(スペースに注意してください!)

その後、次のように個々のエントリにアクセスできます。

for ((i=0; i<n; i++))
do
   file="${filarray[$i]}"
   <whatever operation on the file>
done

エントリの数は以下から取得できます。

n="${#filearray[@]}"

ただし、こののみファイル名に特殊文字(特にスペース)が含まれていない場合に機能します。したがって、もう一度言いますが、lsまたはの出力を解析することfindは推奨されませんあなたの場合は、-execのオプションでfind必要なことが達成できるかどうかを確認することをお勧めします。

関連情報