Bashで名前にパイプとスペースを含むファイルを繰り返す方法

Bashで名前にパイプとスペースを含むファイルを繰り返す方法

この古典的なソリューション(名前にスペースがある場合)は機能しません。

find . -name '*.html' -print0 | while IFS= read -r -d ''; do

htmlファイルにも縦線(|)が含まれているためです。

答え1

find . -name '*.html' -print0 | while IFS= read -r -d ''; do

この行の内容は、名前にスペースおよび/またはパイプの組み合わせを含むファイル名に問題を引き起こしません。

bash-4.4$ touch 'A|B' '1|2' 'quux|foo bar'
bash-4.4$ ls
1|2          A|B          quux|foo bar
bash-4.4$ find . -print0 | while IFS= read -r -d ''; do printf '"%s"\n' "$REPLY"; done
"."
"./A|B"
"./1|2"
"./quux|foo bar"

また、見つけた名前で何をしたいかに応じて、ほとんど常に自分で使用することをお勧めし-execますfind

find . -type f -name "A*" -exec cat {} \;

他の質問に対する関連回答:スペースやその他の特殊文字が原因でシェルスクリプトが停止するのはなぜですか?(特にこの回答の「findで見つけたファイルで何をすべきですか?」を参照してください。)

答え2

find非常に古いバージョンbash(4.0より前)では、このような単純な呼び出しのみが必要です。演算子の使用ははるかに簡単ですglobstar

shopt -s globstar
for f in **/*.html; do
    ...
done

関連情報