财新传媒
位置:博客 > 陈一帅 > 为母亲编程

为母亲编程

去年给妈妈买了一个MP3随声播音机。记得走到妈妈屋里,问她:有什么需要的?她还是一如既往地回答:啥都有,不需要什么。聊了几句,我退出来。刚坐下,她笑着出来说:你到网上看看,有没有那种随身放音乐的机子。那谁有一个,挺好的。我就到网上买了一个最流行的。不贵,声音很好。

一年来,这个播音机成了妈妈的宝。一大早,就拎着出门了:原来,她已做起了老太太晨练的播音员。在家里,也经常是歌声嘹亮。问她怎么这么高兴,她说:听着歌,就很快乐!看她每天带着机器,院子里一个老太太量了机器尺寸,用绳子勾了一个网袋,送给她。她自称很不好意思地收下了。从此,更是机不离手,到哪都带着。

有一天,她拿着机器过来说:你帮我看看,怎么不出声了?我把卡放电脑上一试,发现是卡坏了,就把手机里的卡拔出来给机器换上。妈妈看我舍手机、救播音机的忘我举动,非常感动,关心地问:你手机不用卡了?我说:没事,盒子里还有一张小卡。她松了一口气,说:昨天晚上就不出声了,到处去借机子,今天晚上她们还等着我呢。这下好了。

换了新卡,一直没有存新歌。换卡那天只存了晨练的三首歌。晨练可以继续,平时的歌声却没有了。宝宝和我都开学了,忙得不可开交。妈妈看我忙,也忍着,没找我下歌。歌声就此断了。

昨天,宝宝回家,躲着她妈妈,给我说悄悄话:爸爸,今天是奶奶和妈妈的节日,我们做饭,这是我们的神秘礼物。我还是忙,但也不能让小家伙失望啊。一起完成了《奶酪西兰花烤土豆》,大家吃得很高兴

看着宝宝的孝心,我想,我也不能落后。今天,找妈妈说:我来存些新歌吧。妈妈马上拿起桌上的一张单子,交给我。一看,原来早准备好了,几十首歌的名字列着呢。一一下载。看到她喜欢的歌手,还展开看看,是否还有她喜欢的歌。最后,一共下了91首歌。妈妈这下满意了,高兴地拿着机器回了屋。

过了一会,妈妈抹着汗出来了,说:我要找《保健操》,可是,手都按麻了,还是没找到。原来,歌存进去,顺序乱了,不知道哪首歌是第几首,这样,就不能用输入编号的方法,点播某一首歌了。

这怎么能行呢?我们三个电子工程专业出身的人士(我和宝宝妈、还有一个已经本科毕业了的小弟弟在我们家)顿时感到了“想挑战吗“的激情。

反复尝试,发现以我们的智商,尚不能解密机器的文件排序算法。宝宝妈甚至提出了“按笔画排序”,这种令人泪奔的猜想,最后也告失败。于是,大家想出修改文件名、用数字作为文件名首字目的方法,猜测如果这样,机器应该会从1开始,依次往下播。

确定方案后,开始实现。大家首先分析了网上自动改名软件,发现不能符合我们的“序号+歌曲名”的要求。因此,决定自己编程。

考虑后选择了Mac OS Shell编程,调用AWK的技术方案。然后开始临阵磨刀式的学习:在网上找到类似的代码。调试发现问题。又在网上学习了Shell脚本语法,解决了问题,完成代码编写。

然后进入测试环节。测试发现:机器的播放顺序是 1, 11, 2,这样是不行的。于是决定在文件名前添加0。修改后再测试,发现加1个0,只能支持99首歌。于是又加一个0,支持999首歌。

最后,打印生成歌曲目录。首先利用Mac OS命令行程序,获得音乐文件名列表。然后导入Excel,再拷贝入Word。然后Word排版:双栏,表格右上对齐。最后手动双面打印。大功告成。

我们把目录和机器送给妈妈,并高兴地告诉她:这是我们编程实现的。妈妈很高兴:养兵千日,用兵一时。送你们读了这么多年的书,今天终于知道你们是干嘛的了,避免了痛苦地依次听完91首歌,手工整理目录。我们也很高兴,笑着说:我们再为小区大妈们提供此类服务吧。此外,把代码开源出来,供天下有志于为妈妈整理音乐、照片、视频等一切电子文档的朋友们参考。

于是,就有了这篇小文。代码如下。使用方法如下:假设:需要加序号的文件都在mama目录下。那么,这段代码应该放在一个shell脚本里,在mama目录的上一级目录运行。当然,这段代码还非常初级,有很大优化空间。我们就抛砖引玉,把这些优化工作,留给各位跃跃欲试的技术大拿吧。:)

#!/bin/bash
cd mama
i=0;
for k in `ls -1`; do
    i=$(expr $i + 1)
    n=`echo "$k" | awk -F. 'OFS="."{$NF="";print}'`
    e=`echo "$k" | awk -F. '{print $NF}'`
    if [ $i -lt 10 ] ; then
        echo $i "rename: $n$e =====> 00$i-$n$e"
        mv -n "$n$e" "00$i-$n$e"
    elif [ $i -lt 100 ] ; then
        echo $i "rename: $n$e =====> 0$i-$n$e"
        mv -n "$n$e" "0$i-$n$e"
    elif [ $i -lt 1000 ] ; then
        echo $i "rename: $n$e =====> $i-$n$e"
        mv -n "$n$e" "$i-$n$e"
    else
        echo "There are more than 999 files. Change you code!"
    fi
 
done
exit 0

致谢:

上述代码,基于“永远在网络上飘荡的幽灵…”的代码[1]修改而成,特此致谢。

参考文献:

1)永远在网络上飘荡的幽灵…,《批量重命名并加序列号》,http://www.enun.net/?p=1858

2)Leal,《Shell编程基础》,http://wiki.ubuntu.org.cn/Shell%E7%BC%96%E7%A8%8B%E5%9F%BA%E7%A1%80



推荐 17