質問: ファイル名にスペースが含まれている場合、findコマンドの出力を解析するにはどうすればよいですか? 次のようなループを使用するfor i in `find . -name \*.txt` 一部のファイル名にスペースが含まれていると、破損します。この問題を回避するためにどのような手法を使用できますか?
回答: bash bashersに同意しません。bashは、* nixツールセットと共に、ファイル(名前に空白が埋め込まれているものも含む)の処理に長けているためです。実際、findを使用すると、処理するファイルをきめ細かく制御できます... bash側では、文字列をbash wordsにする必要があることを理解するだけで済みます。通常、「二重引用符」、またはifsを使用するような他のメカニズムを使用するか、または{}ほとんど/多くの状況では、ifsを設定およびリセットする必要がないことに注意してください。以下の例に示すように、ローカルでifsを使用するだけです。 3つすべてが空白をうまく処理します。また、find's\; is事実上ループであるため、「標準」ループ構造は必要ありません。ループロジックをbash関数に入れるだけです(標準ツールを呼び出さない場合)。ifs=$'\n' find ~/ -name '*.txt' -exec function-or-util {} \; そして、さらに2つの例ifs=$'\n' find ~/ -name '*.txt' -exec printf 'hello %s\n' {} \; ifs=$'\n' find ~/ -name '*.txt' -exec echo {} \+ |sed 's/home//' 'findalso allows you to pass multiple filenames as args to you script ..(if it suits your need: use + instead \; `)