バックスラッシュとスペースを処理するように検索関数ループをどのように変更しますか? [コピー]

バックスラッシュとスペースを処理するように検索関数ループをどのように変更しますか? [コピー]

現在のディレクトリ内のすべてのファイルを解析しようとしています。検索機能はありますが、空白のあるファイルディレクトリをループに解析できないようです。"$DIR"私が検索したいディレクトリは次のとおりです。誰でもこれがうまくいくように修正する方法を知っていますか?ありがとうございます。

for file in $(find "$DIR" -type f)
do
   echo "$file"
done

答え1

find ... | xargs ...どちらfind ... -exec ...もこれより良いオプションです。シェルループを使用して検索結果を正しく繰り返すには、ループを使用する必要がありますwhile read

while IFS= read -d '' -r filename; do 
    echo "$filename"
done < <(find "$dir" -type f -print0)

そこには解くべき内容がたくさんあります。

  • 私たちはプロセスの交換find コマンドを実行すると、結果をファイルのように読み取ることができます。
  • 入力行をそのまま読むには、bashイディオムはですIFS= read -r line。これにより、任意のスペースとバックスラッシュを変数として読み取ることができます。
  • read -d ''-print0改行文字の代わりに行末文字としてヌルバイト(によって生成された)を使用してください。

答え2

forこれを繰り返す必要はありません。

find "$dir" -type f

デフォルトでは、見つかったすべてのオブジェクトが出力されます。

これにより、これを明確にすることができます。

find "$dir" -type f -print

もしあなたなら本物これを繰り返すには、空の区切り文字を使用して次のようにしますxargs

find "$dir" -type f -print0 | xargs -0 -n1 echo

またはfindあなた自身の-exec

find "$dir" -type f -exec echo "{}" \;

答え3

あなたはする必要があります出力を解析しません。findあなたも同じ理由で解析しないでくださいls

次の代わりにfind/を試してください。exec

find "$DIR" -type f -exec echo {} \;

関連情報