Dockerコンテナで使用するには、ファイルリスト(プレイリスト)を作成する必要があります。したがって、ホストシステムのファイルパスはインストールパスではありません。これでこの問題を解決しようとしていますが、問題が少しあります。
これは代替エントリを追加したいスクリプトです。
tdir="/mountingpoint"
readarray -d $'\0' listing < <(find "${fdir}"/*.mp3 -print0)
#for mixing up and write to file
listing=( $(shuf -e "${listing[@]}") )
printf "%s\n" "${listing[@]}" > "playlist.m3u"
一般的なアプローチは使用することです。sed
しかし、一緒に使用するには少し難しいです。スクリプトを次のように修正する必要があるようですがreadarray -d $'\0' listing < <(find "${fdir}"/"${d}"/ -name "*.mp3" -print0 -exec sed -i "s/"$fdir"/"$tdir"/" {} \;)
、これはディレクトリ名の sed: -e expression #1, char 9: unknown option to `s'
スラッシュがこのエラーを引き起こしているようです。しかし、結果を確認するために変数をフォルダ名に変更しようとしましたが、何も起こりませんでした(実行時間が長くなることを除いて)。 「なし」は、出力ファイルに代替項目がないことを意味します。
私は誰かが私の不足している英語のスキルを指摘し、私が間違っていることをヒントを与えることができることを願っています。ありがとう
答え1
〜のように@イカルス持つ指摘、対応する-exec
オプションはここでは意味がありません。空の区切りファイルにsed置換を適用しようとしています。名前、次の名前に表示される可能性のない sed パターン区切り文字を使用します。
find "${fdir}/${d}" -name '*.mp3' -print0 | sed -z "s:$fdir:$tdir:"
IMHO、パイプライン内にシャッフリングを含めない理由はありません。
find "${fdir}/${d}" -name '*.mp3' -print0 | sed -z "s:$fdir:$tdir:" | shuf -z
たとえば、与えられた
~$ find . -name '*.mp3'
./dir/1.mp3
./dir/2.mp3
./dir/3.mp3
./dir/4.mp3
./dir/5.mp3
それから
~$ fdir=./dir; tdir='./new/dir'
~$ readarray -t -d '' listing < <(find . -name '*.mp3' -print0 | sed -z "s:$fdir:$tdir:" | shuf -z)
~$ printf '%s\n' "${listing[@]}"
./new/dir/3.mp3
./new/dir/1.mp3
./new/dir/4.mp3
./new/dir/2.mp3
./new/dir/5.mp3
答え2
zsh
代わりに使用してくださいbash
:
() {print -rC1 -- $tdir/$^@} $fdir/*.mp3(Noe['REPLY=$RANDOM']:t)
あるいは、文字も含まず、含まないと仮定$fdir
し$tdir
ます:
。
print -rC1 -- $fdir/*.mp3(Noe['REPLY=$RANDOM']:s:$fdir:$tdir)
bash
4.4+とGNU shuf
(または)を使用すると、sort -zR
いつでも次のことができます。
print0() { [ "$#" -eq 0 ] || printf '%s\0' "$@"; }
println() { [ "$#" -eq 0 ] || printf '%s\n' "$@"; }
readarray -td '' listing < <(
shopt -s nullglob
cd -P -- "$fdir" && print0 *.mp3 | shuf -z)
println "${listing[@]/#/$tdir}"
または:
print0() { [ "$#" -eq 0 ] || printf '%s\0' "$@"; }
println() { [ "$#" -eq 0 ] || printf '%s\n' "$@"; }
readarray -td '' listing < <(
shopt -s nullglob
print0 "$fdir"/*.mp3 | shuf -z)
println "${listing[@]/#"$fdir"/$tdir}"
等しいことで。