たとえば、mp3ファイルのリストを作成したいと思いますa 1.mp3|a 2.mp3
。
いくつかのバリエーションを試しましたが、うまくいきecho ${(j:|:)$(echo *.mp3)}
ません。
# too much splitting
01|The|Magic|Finger|01.mp3|02|The|Magic|Finger|02.mp3|03|The|Magic|Finger|03.mp3|04|The|Magic|Finger|04.mp3|05|The|Magic|Finger|05.mp3|06|The|Magic|Finger|06.mp3
# too much quoting
01 The Magic Finger 01.mp3 02 The Magic Finger 02.mp3 03 The Magic Finger 03.mp3 04 The Magic Finger 04.mp3 05 The Magic Finger 05.mp3 06 The Magic Finger 06.mp3
これを行うための関数や変数を作成したくありません。 (簡単にできます。)
答え1
mp3ファイルのリストを取得し、スペースecho
で区切って印刷できるように渡し、出力をパイプして読み取り、スペース/タブ/改行/ NULに分割します|
。
次のいずれかを実行します。
printf '%s|' *.mp3
または
files=(*.mp3)
joined=${(j:|:)files}
これらのファイル名をパターンとして使用する場合は、zsh
ワイルドカード文字をエスケープする必要があります。これはb
パラメータ拡張フラグを介して行われます。
pattern="(${(j:|:)${(b@)files}})"
答え2
set
以下を使用して、これらのファイルを場所パラメータに配置できます"$*"
。
set -- *.mp3
(IFS=\|; echo "$*")
これはサブシェルで行われるため、IFS への変更は現在のシェルには影響しません。
答え3
これを行う方法を見つけましたが、次の簡単なユースケースはまだ非常に複雑です。
echo ${(j:|:)"${(@f)$(print -l *.mp3)}"}