将终端的动态输出写入文本文件

将终端的动态输出写入文本文件

归根结底,它可以将dynamic output终端(我会解释)保存到文本文件中,但这是我最终想要的。

我为终端创建了一个名为的自定义命令playRandom,它的作用是永久播放随机歌曲。我为此创建的 bash 文件:

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

注意:该play命令来自索克斯软件。

现在输出看起来像这样:

playRandom 命令

正如您所看到的,输出发生了变化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中列出,如下所示:findfind

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在您当前目录中创建一个名为的文件,其中包含所有曲目名称。

相关内容