二重引用符で囲まれた引数は、特定のファイル名を繰り返すときにファイル名が破損するのを防ぎません。
$ mkdir temp
$ cd temp/
$ touch a\ b
$ for f in $(find .) ; do echo "$f" ; done
.
./a
b
ベストアンサー1
このディレクティブは、for f in $(find .)
要素のリストを空白に基づいて繰り返し分割します。 zshのような最新のシェルでは、拡張フラグとして使用できます。
for f in "${(@f)$(find .)}" ; do echo "$f" ; done
滞在すればbash
、この問題を解決できます。他の質問で述べたようにfind
結果を変数に割り当てながら、入力区切り文字(要素を区切るために使用される文字)を一時的に変更します。一時的にゴービングを無効にすると、その*
文字のようなワイルドカード文字の拡張が防止されます。
set -f # Disable globbing.
IFS=$(echo -e '\0') files=( $(find . -print0) ) # Read newline separated files into an array.
for f in ${files[@]}; do echo $f; done
set +f # Reenable globbing.
ただし、これは問題を変更しただけで、ファイル名に改行文字が含まれている場合は機能しません。おそらく、すべてのファイルシステムで禁止されているものの1つはNULL文字です。ただし、bashの変数はそれを保持しない可能性があるため、に割り当てることはできませんIFS
。
find
または、xargsを使用してパスを別のプログラムに渡すこともできます。 null文字を区切り文字として使用するto-print0
コマンドを使用しfind
て-0
toに切り替えます。一度に1つのファイル名を処理するために呼び出しにxargs
追加されました。-n1
xargs
find . -print0 | xargs -0 -n1 echo