一个修改过的shell脚本可以将音频文件从FLAC格式转换为MP3格式。计算机使用四核CPU。该脚本通过以下方式运行:
./flac2mp3.sh $(find flac -type f)
这段代码将
flac
目录中的FLAC文件(文件名中不能有空格)转换为mp3
目录中的MP3文件(与flac
在同一层级)。如果目标MP3文件已经存在,则跳过该文件。问题是有时候脚本的两个实例几乎同时检查同一个MP3文件是否存在,导致生成损坏的MP3文件。
您如何多次运行脚本(即每个核心运行一次),而无需在每个命令行中指定不同的文件集,并且不会覆盖工作?
更新-最小竞态条件
脚本使用以下锁定机制:
# Convert FLAC to MP3 using tags from flac file.
#
if [ ! -e $FLAC.lock ]; then
touch $FLAC.lock
flac -dc "$FLAC" | lame${lame_opts} \
--tt "$TITLE" \
--tn "$TRACKNUMBER" \
--tg "$GENRE" \
--ty "$DATE" \
--ta "$ARTIST" \
--tl "$ALBUM" \
--add-id3v2 \
- "$MP3"
rm $FLAC.lock
fi;
然而,这仍然存在竞态条件。
if test $? -eq 0
也是一种反模式。 - tripleee