归根结底,它可以将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
通过xargs
或再次通过while 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=).*"
它将为您返回当前播放的歌曲的名称,并且您可以使用将其重定向到文件>
。
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
在您当前目录中创建一个名为的文件,其中包含所有曲目名称。