zshで空白を含む要素を一覧表示する

zshで空白を含む要素を一覧表示する

これまで2時間の間zshスクリプトを学びました。空白がある可能性があるファイルのリストを見つけたいです。私はzshである限り、以下の例にはまったく異なるアプローチを使用できます。なぜなら、zshは私がスクリプトを書くのではなく、私が作業しているからです。

files=(`ls`)
for f in $files; do
    print $f
done

明らかに私は単に再構築するのではなく、ループが繰り返されるたびにフルファイル名をキャプチャlsしたいと思います。$f

答え1

まず、使用法はls単なる例であると仮定します。lsあいまいなので、どのシェルでも出力を解析できません。読むls(1) の出力を分析しない理由これがあなたにニュースなら。すべてのシェルからファイルのリストを取得するにはfiles=(*)

zshでは、他のシェルと同様に、結果は次のようになります。コマンドの置き換え空白文字から単語に分割します(より正確には値に基づいてIFS)。 (他のシェルとは異なり、コマンド置換の結果はzshのglobbingの影響を受けません。)したがって、コマンドの出力が次のようなls場合

hello world
wibble

次に、および3つの要素を含むように配列をfiles=($(ls))設定します。fileshelloworldwibble

コマンド置換を二重引用符で囲むと、分割は行われません。カスタム分割を実行できます。パラメータ拡張フラグ。この@フラグを使用して、分割結果が配列であることを示します(異常には拡張を二重引用符で保持する必要があります。つまり、二重引用符で囲まれた"${(@)…}"文字列も複数の単語に展開されます)。分割の場合は、コンマで分割などのsフラグを使用してください"${(@s:,:)…}"。このfフラグは改行でのみ分割されます。

files=("${(@f)$(ls)}")

通常、配列を繰り返す正しい方法は空の要素をfor f in $files[@]削除することです$files(ここでは要素が空ではないため、これは重要ではありません)。

print $faで始まり、バックスラッシュを拡張すると、$fスイッチとして解釈されます。文字列の後に改行文字が必要ない場合は、またはを使用してください。-$fprint -r -- $fprint -rn -- $f

答え2

zsh では、デフォルトでは単語分離を行わないシェル拡張を使用できます。努力する

for f in /path/to/files/*; do
    print ${f}
done

関連情報