readarray コマンドで find 出力の一部を置き換えます。

readarray コマンドで find 出力の一部を置き換えます。

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

おすすめ記事