web-dev-qa-db-ja.com

ターミナルの動的出力をテキストファイルに書き込む

端末のdynamic output(説明します)をテキストファイルに保存できるようになりますが、最終的に求めているのは次のとおりです。

playRandomという端末用のカスタムコマンドを作成しました。それは、ランダムな曲を永遠に再生するということです。このために作成したbashファイル:

#!/bin/bash 
find ./ -type f | sort -R | xargs -I + play +

注:playコマンドは SoX softwareからのものです。

これで、出力は次のようになります。

playRandom command

ご覧のとおり、出力がdynamicallyに変化するため、>>を使用して出力を保存することはできません。

「再生する曲の名前」をテキストファイルに保存できるようにしたい。

どうすればこの目標を達成できますか?前もって感謝します。

4
deergadan

現在再生されているファイル名を保存する

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のようなものでスクリプトの出力をリアルタイムで追跡できます。

NOTEplaylist.txtfindの出力変更にリストされるのを避けるため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
10
find ./ -type f | sort -R | tee text.file | xargs -I + play +  

man teeも参照してください。

8
waltinator

ここに私の解決策があります:

1.リアルタイム(現在再生中)

playコマンドを実行した後、これを使用します。

soxi "$(readlink /proc/`pidof play`/fd/3)" | grep -Po "(?<=Title=).*"

現在再生中の曲の名前が返され、>を使用してファイルにリダイレクトできます。

1.1。ノート

/proc/`pidof play`/fd/3
  • 現在の再生トラック(ファイル)のファイル記述子です。
  • readlinkを使用して、ファイル名を取得します
  • soxiを使用して、その情報を取得します
  • grepを使用して、トラックタイトルをカットします

2.プレイする前に(すべての名前をリストする)

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という名前のファイルが現在のディレクトリに作成されます。

3
Ravexina