將終端機的動態輸出寫入文字文件

將終端機的動態輸出寫入文字文件

歸根結底是能夠將dynamic output終端(我將解釋)保存到文字檔案中,但這就是我最終想要的。

我為名為 的終端機創建了一個自訂命令playRandom,它的作用是永遠播放隨機歌曲。我為此創建的 bash 檔案:

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

註:該play命令來自索克斯軟體.

現在輸出看起來像這樣:

播放隨機指令

正如你所看到的輸出變化dynamically,所以我不能用來>>保存輸出。

我希望能夠將“播放的歌曲名稱”保存到文字檔案中。

我怎樣才能實現這個目標?提前致謝。

答案1

儲存目前播放的檔案名

由於該play命令在播放單個文件後終止,因此我們可以做的不是使用xargs並提供play一批文件,而是一次取出每個文件,並將其回顯到文件,然後播放該文件。編輯後的腳本如下圖所示。請注意,這裡新增了額外的選項和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.

筆記:避免playlist.txt被列在find的輸出更改find命令中,如下所示:

find ./ -type f -not -name "playlist.txt" -print0

此外,如果我們想確保只.mp3列出文件,我們可以這樣做:

find ./ -type f \( -not -name "playlist.txt" -and -name "*.mp3" \) -print0

儲存找到的要播放的檔案列表

如果我們的目標是保護文件列表它被播放了,沒有太多科學依據 - 查找排序管道可以首先寫入文件,然後可以將該文件饋送到playviaxargs或再次 viawhile IFS= read -r ; do ... done結構

#!/bin/bash 

find ./ -type f -print0 | sort -z -R > playlist.txt

while IFS= read -d '' -r filename
do
    clear
    play "$filename"
done < playlist.txt

答案2

find ./ -type f | sort -R | tee text.file | xargs -I + play +  

另見man tee

答案3

這是我的解決方案:

1.即時(目前播放)

運行play命令後,使用以下命令:

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

它將為您返回當前正在播放的歌曲的名稱,並且您可以使用 .txt 將其重定向到檔案>

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在當前目錄中命名的文件,其中包含所有曲目名稱。

相關內容