Ami*_*ani 4 sound command-line bash scripts sox
归结为能够dynamic output将终端的(我将解释)保存到文本文件中,但这就是我最终要寻找的。
我为名为 的终端创建了一个自定义命令playRandom,它的作用是永远播放随机歌曲。我为此创建的 bash 文件:
#!/bin/bash
find ./ -type f | sort -R | xargs -I + play +
Run Code Online (Sandbox Code Playgroud)
注意:该play命令来自SoX软件。
现在输出看起来像这样:

正如你所看到的输出变化dynamically,所以我不能>>用来保存输出。
我希望能够将“播放的歌曲名称”保存到文本文件中。
我怎样才能实现这个目标?提前致谢。
Ser*_*nyy 10
由于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
Run Code Online (Sandbox Code Playgroud)
这种方法的优点是文件名将在播放时进入 playlist.txt,这使我们能够实时跟踪脚本的输出,例如tail -F playlist.txt.
注意:为了避免playlist.txt被列在find's output changefind命令中,如下所示:
find ./ -type f -not -name "playlist.txt" -print0
Run Code Online (Sandbox Code Playgroud)
此外,如果我们想确保只.mp3列出文件,我们可以这样做:
find ./ -type f \( -not -name "playlist.txt" -and -name "*.mp3" \) -print0
Run Code Online (Sandbox Code Playgroud)
如果我们的目标是安全的文件列表之前更是打出了,有没有很多科学的它-查找,排序管道可以首先被写入文件,而该文件随后被送入play或者通过xargs或再通过while IFS= read -r ; do ... done结构
find ./ -type f -not -name "playlist.txt" -print0
Run Code Online (Sandbox Code Playgroud)
find ./ -type f | sort -R | tee text.file | xargs -I + play +
Run Code Online (Sandbox Code Playgroud)
另见man tee。