歸根結底是能夠將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
儲存找到的要播放的檔案列表
如果我們的目標是保護文件列表前它被播放了,沒有太多科學依據 - 查找排序管道可以首先寫入文件,然後可以將該文件饋送到play
viaxargs
或再次 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
在當前目錄中命名的文件,其中包含所有曲目名稱。