我有一些数据文件,它们以专有方式提供歌曲的文件名。现在我想将该数据转换为 m3u 文件并使其可供所有应用程序使用。我不想使用像 cronjob 这样的东西来生成 m3u 文件,因为它不像我想要的那样动态。
因此,我决定使用命名管道。我的场景如下所示:
-rw-rw-rw-+ 1 sjngm sjngm 33929 6. May 12:56 songstore-1.data
prw-r--r-- 1 sjngm sjngm 0 6. May 18:38 songstore-1.data.m3u
-rw-rw-rw- 1 sjngm sjngm 7750 6. May 12:56 songstore-2.data
prw-r--r-- 1 sjngm sjngm 0 6. May 18:38 songstore-2.data.m3u
:
对一个文件执行一次运行的脚本似乎很好地完成了它的工作:
#/bin/bash
file="$1"
echo "#EXTM3U"
paste -d '\n' \
<(tail -n +4 "$file" | grep "^#DESCRIPTION" | sed -e 's/#DESCRIPTION /#EXTINF:0,/') \
<(tail -n +4 "$file" | grep "^#SERVICE" | cut -d ':' -f 11 | sed -e 's/%3a/:/gi')
这是最终应存储在的 shell 脚本代码~/.xprofile
:
cd ~/garage/songstores
ls -1 songstore-* |
paste - - |
while read in pipe; do
echo "$in..."
while true; do
~/shell-scripts/convert.sh "$in" > "$pipe"
done &
done
运行此命令后,循环将显示在 中ps
。当我cat
使用 m3u 时,输出会出现多次,而不仅仅是一次。一个歌曲库文件实际上是空的,输出是:
$ cat songstore-13.data.m3u
#EXTM3U
#EXTM3U
#EXTM3U
#EXTM3U
#EXTM3U
#EXTM3U
#EXTM3U
#EXTM3U
#EXTM3U
#EXTM3U
#EXTM3U
#EXTM3U
#EXTM3U
#EXTM3U
#EXTM3U
#EXTM3U
#EXTM3U
#EXTM3U
#EXTM3U
#EXTM3U
#EXTM3U
#EXTM3U
$
下次执行时,cat
行数会有所不同,但总是不止一行。这个想法是cat
只显示一次内容。
同样,当在命令行上单次执行运行时,脚本本身可以工作。问题必须与管道以及我如何写入(或读取)它们有关。
我在那里不明白什么以及如何解决它?
答案1
两件事情:
1)我对外循环脚本应用了睡眠:
for f in /home/sjngm/garage/songstores-*.data; do
echo "$f..."
while true; do
/home/sjngm/shell-scripts/convert.sh "$f" > "$f.m3u"
sleep 2
done &
done
2)如果有人想要这样做:当已经尝试写入命名管道时,使用进程替换似乎不起作用。因此,使用临时文件的老式方法在这里有所帮助:
#/bin/bash
file="$1"
tmpFile1="/tmp/`uuidgen`"
tmpFile2="/tmp/`uuidgen`"
tail -n +4 "$file" | grep "^#DESCRIPTION" | sed -e 's/#DESCRIPTION /#EXTINF:0,/' > $tmpFile1
tail -n +4 "$file" | grep "^#SERVICE" | cut -d ':' -f 11 | sed -e 's/%3a/:/gi' > $tmpFile2
echo "#EXTM3U"
paste -d '\n' $tmpFile1 $tmpFile2
rm $tmpFile1 $tmpFile2