Sunday, March 29

Shell 编程

在KDE里,可以很方便地选中一堆文件,点右键“rename”,输入一个名字比如"winter",就可以把这些文件都换名为 winter1.pdf, winter2.pdf, winter3.pdf...

在Gnome的Nautilus里就没有这个功能。只要你选中多于1个文件,rename的菜单项就变成灰色了。因此昨天我找了找,发现了一个类似的功能“Mass Rename”,能够输入一个regular express来换名字,糟糕的是在我机器上它根本不能运行。

起码,我有了一个起点。我就以它为范本,做出了自己的Mass Sequential Rename:

#!/bin/bash
# Nautilus script for mass file renaming.
# Modified by Ben(AT)Fadshop.net. http://benincampus.blogspot.com .Mar 29, 2009
# Based on http://jrfonseca.blogspot.com/2006/05/mass-renaming-in-nautilus.html


set -e

TITLE=`basename "$0"`


EXPR=""

EXPR=`zenity --title "$TITLE - expression" --entry --text "Specify the Prefix for modifying the filenames." --entry-text "$EXPR"` || exit

NUM=0


IFS=$'\n'
for FILE in $NAUTILUS_SCRIPT_SELECTED_FILE_PATHS
do
cd "`dirname "$FILE"`"
filename=""`basename "$FILE"`""
EXT="${filename/*./}"

mv ""`basename "$FILE"`"" "$EXPR$NUM.$EXT"
NUM=$((NUM+1))

done


使用方式:把上面这段代码写成文件 ~/.gnome2/nautilus-scripts/Mass Sequential Rename ,然后把它变成可执行。从此在nautilus的右键菜单里就有个Scripts->Mass Sequential Rename的选项,可以作上面我所说的批量命名。

做这段程序最头疼的是没有什么文档。到底是bash,还是sh?
也没办法调试,一出错就直接停止运行,不知道出错信息放到哪里。
第三,单引号、双引号、两个双引号,到底怎么个用法,我只能一个一个地试。有一个问题就是我用mv "`basename "$FILE"`" $newname的时候,原文件名中有空格,就弄死程序了。用了许久才发现问题,又google了许多才知道要用两个双引号。什么时候在变量前用$,什么时候不用,也很乱。
第四,最生气的,是EXT="${filename/*./}"这句,我为了版式好看,在等于号左右各加了个空格,程序就死了。我还以为是这句话的关系,用1小时来查找错误,偶尔把空格删除掉,才惊奇地发现成功了。

总之,虽然shell编程也是很有前途的一件事情,但是缺少文档、缺少调试环境、缺少现代语法,甚至对空格都不能容忍,这样的语言是没法用的。只能是一些遗老遗少们自我陶醉的一种语言。

参考连接:
Mass Renaming in Nautilus
Extending Nautilus with Scripts and Extensions