端末のdynamic output
(説明します)をテキストファイルに保存できるようになりますが、最終的に求めているのは次のとおりです。
playRandom
という端末用のカスタムコマンドを作成しました。それは、ランダムな曲を永遠に再生するということです。このために作成したbashファイル:
#!/bin/bash
find ./ -type f | sort -R | xargs -I + play +
注:play
コマンドは SoX softwareからのものです。
これで、出力は次のようになります。
ご覧のとおり、出力がdynamically
に変化するため、>>
を使用して出力を保存することはできません。
「再生する曲の名前」をテキストファイルに保存できるようにしたい。
どうすればこの目標を達成できますか?前もって感謝します。
play
コマンドは1つのファイルを再生した後に終了するため、xargs
を使用してplay
にファイルのバッチを与える代わりに、各ファイルを1つずつ取り出します。それをファイルにエコーし、その後ファイルを再生します。編集したスクリプトは次のようになります。安全な方法でファイル名を処理するための追加オプションとIFS= read -d'' -r
コマンドが追加されていることに注意してください。
#!/bin/bash
# create file for playing songs first
echo > playlist.txt
# Now play each song and echo filename to file
find ./ -type f -print0 | sort -z -R | while IFS= read -d '' -r filename
do
clear
echo "$filename" >> playlist.txt
play "$filename"
done
このアプローチの利点は、ファイル名が再生されると、playlist.txtに格納されることです。これにより、tail -F playlist.txt
のようなものでスクリプトの出力をリアルタイムで追跡できます。
NOTE:playlist.txt
がfind
の出力変更にリストされるのを避けるためfind
コマンドは次のようになります。
find ./ -type f -not -name "playlist.txt" -print0
さらに、.mp3
ファイルのみがリストされるようにしたい場合、これを行うことができます。
find ./ -type f \( -not -name "playlist.txt" -and -name "*.mp3" \) -print0
私たちの目標が、再生される前にファイルリストを安全にすることである場合、それほど科学的ではありません-検索ソートパイプラインは、最初にファイルを作成してから、そのファイルをplay
経由で、またはwhile IFS= read -r ; do ... done
構造経由でxargs
にフィードできます。
#!/bin/bash
find ./ -type f -print0 | sort -z -R > playlist.txt
while IFS= read -d '' -r filename
do
clear
play "$filename"
done < playlist.txt
find ./ -type f | sort -R | tee text.file | xargs -I + play +
man tee
も参照してください。
ここに私の解決策があります:
play
コマンドを実行した後、これを使用します。
soxi "$(readlink /proc/`pidof play`/fd/3)" | grep -Po "(?<=Title=).*"
現在再生中の曲の名前が返され、>
を使用してファイルにリダイレクトできます。
/proc/`pidof play`/fd/3
readlink
を使用して、ファイル名を取得しますsoxi
を使用して、その情報を取得しますgrep
を使用して、トラックタイトルをカットしますfind ./ -type f | sort -R | tee /tmp/play-files | xargs -I + soxi "+"\
| grep -Po "(?<=Title=).*" > list_of_names && xargs < /tmp/play-files\
-I + play "+"
すべてのトラック名を含むlist_of_names
という名前のファイルが現在のディレクトリに作成されます。