加载中…
正文 字体大小:

使用zsh中的zmv

(2013-07-06 06:04:43)
标签:

电脑

苹果

unix

在DOS下,我们知道那个最著名的批量重命名命令
rename "*.txt" "*.exe"
它把文件夹里所有的txt后缀文件都改成了exe后缀。

在Mac下,虽然键盘操作在Finder中重命名单个文件无比简单,却没有这么简单粗暴的重命名方式。当然,对于进阶用户,我们可以用机器人编一个程序,也可以用苹果的脚本。只是,对重命名模版的控制总是缺少了些什么。幸好,狭义上说,Mac OSX是一个Unix系统。


Unix独特的系统结构不值得向普通Mac用户赘述,他们需要的不是哲学典籍,而是可以马上拿来用的直观工具书,所以在此只引入一个概念,那就是层——shell。直观的解释就是Unix的命令象洋葱一样一层又一层,OSX的图形界面就是最外面的一层,这是OSX这个Unix所独有的。而包得比较深的,各个Unix都有的,则有字符操作界面,譬如bash和sh,bash就是打开terminal.app你所看到的,也是网上很多修改Mac预设的命令真正操作的东西。为了简单理解,不妨把terminal.app当作是bash这种字符操作“系统”的一个虚拟机。
bash中的重命名命令,就是mv,它同时也是一个复制粘贴命令,对单个文件文件夹操作它有强大之处,而对多个文件操作却无力。
幸好,Unix天生包容植入其他的层,可以轻松对付多文件重命名的zsh层(出现于1990年,那一年苏联改了国号,**的青年在街上阻挡**,世界会变?)就是其中之一。同样在terminal窗口中,输入zsh,回车,你便开启了一个新的世界。

bash层的标志是用户名后面的$符号,而zsh层,则是%符号,与随时显示当前目录名称的bash层相比,zsh不显示当前目录,与sh相似,所以使用zsh命令的时候,切记要先ls一下,看看是不是在自己希望操作的目录中,以免误伤。
我们关注的zsh命令,是重命名命令zmv,下面的介绍也只是围绕这一个。希望能有抛砖引玉的效果。


在zsh中,首先要导入命令脚本,形象地说就是要先“安装”。Bash不需要这么做,是因为bash的命令基本上都在某几个bin文件夹中,而这些文件夹的位置已经保存在了bash的预设文件里,每次bash启动都会先扫描这几个地方,明白有哪些命令安装了,可以用,在bash下,一个最简单的查看办法就是输入which命令,譬如输入which ls,会显示/bin/ls,这就是这个二进制可执行文件存在的位置。在sh层中也是一样的,因为这两个层很多命令是相同的。而zsh则不一样,当然zsh包含了bash的功能,ls,mv这种命令是天然存在的,可我们需要用到的zmv却没有。为此,第一件事,我们需要导入这个命令,方法是输入
autoload zmv,或者
autoload -U zmv
这个U旗子的意思就不解释了,并不重要,重要的是你现在拥有了比DOS的rename命令更强大的工具,下面用例子来说明


例子一,"交换"

如果用folx下载,一个很容易发生的现象就是因为当前目录有重名文件,新下载的文件被添加了后缀编号。譬如
A.txt,A.1.txt,A.2.txt 会同时存在。
事实上,1和2可能是对应着第一章,第二章,我们更希望把A和数字交换顺序,可以完成这个任务的命令是
zmv '(*).(*).txt' '$2.$1.txt'

简单明了,首先我们制定了一个搜索pattern,把A读作1列表,把数字1,2,3读作2列表,在重命令的时候再指定把这两个东东交换,把$2读出来放在$1的前面。

zmv还提供了预览功能,不必担心自己手滑,只要添加一个旗子n:
zmv -n '(*).(*).txt' '$2.$1.txt'

就可以先打印出重命名的效果


例子二:补全数字标号

如果你下载了 1.txt, 2.txt,。。。9.txt,10.txt,11.txt,而你又有洁癖,那么一定会强迫自己把他们改名为 01.txt,...09.txt,10.txt
一个一个修改太傻,让zmv来完成好了

一个naive的想法是
zmv '([0-9]*)' '0$1'

但这是失败的,虽然1.txt被改成了01.txt,那些10.txt却也变成了010.txt

正确的命令是

zmv '([0-9]).(*)' '0$1.$2'
换句话说我们只寻找开头一位数字,紧跟着就是“.”号的文件并命名。

同样的,如果文件是011.txt,012.txt,你想去掉开头的零,则用以下命令可以实现:
zmv '(0)(*)' '$2'


例子三!改后缀

现在你明白了吧,zmv的工作原理就是两部,首先按照你指定的pattern,来寻找那些括号括起来的内容 (1)就是数字1,(〔0-9〕)就是数字,(A)就是大写字母A,而(*)就是任何东西。如果不用括号括起来,那就是查找而不读取纪录,括了起来就可以在下一步重命名的时候引用,按顺序取作$1,$2,。。。在zsh看来,扩展符“-”,“.”都是和数字字母一样平等的东西,所以改后缀的命令也就无非是

zmv '(*).txt' '$1.doc'了


例子四:移入新建文件夹

这就是itunes管理音乐的办法,我们也可以用zmv来实现一部分
譬如瞎猫搞了一些音乐文件,本来的名字都是 歌手-专辑-曲号-曲名.后缀
现在我们可以把这些音乐整理到文件夹中:

zmv '(*) - (*) - (*) - (*).mp3' '$1/$1 - $2/$1 - $2 - $3 - $3.mp3'

当然也可以反过来,利用目录符号"/" 在包含子目录的情况下查找并改名,譬如下面的命令就能把子目录下的文件运回上级目录。
zmv '(**/)(*).mp3' '$2.mp3'


例子五:大小写

对Unix来说,文件名中的大小写是区分的,我们可以用这种办法来实现大小写转换:
zmv '(*).pdf' '${(U)1}.pdf'
zmv '(*).pdf' '${(L)1}.pdf'
zmv '(*).pdf' '${(C)1}.pdf'

其中U是所有字母都改成大写,L是字母全改成小写,C是首字母改成大写。

既然说到了这里,为了寻找pdf的时候也同时对PDF操作,我们可以加上一个(#i)令命令不区分大小写的搜索
zmv '(#i)(*).pdf' '${(L)1}.AVI'


最后总结

zsh是一个很难学的层,但它的方便程度也是超乎想象的。它的延展性互动性等突出特点令它可称作最高端的shell。本文的目的也便是绕开zsh的种种硬骨头,仅就zmv命令展示一下利用pattern对文件操作这种思想。基本的东西明白之后,pattern是可以很灵活的。如果某一天你想用zmv了,不需要去搜索什么长长的用户手册,打开百度点开这个帖子查一下就应该可以上手了。

0

阅读 评论 收藏 转载 喜欢 打印举报
  • 评论加载中,请稍候...
发评论

       

    发评论

    以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

      

    新浪BLOG意见反馈留言板 不良信息反馈 电话:4006900000 提示音后按1键(按当地市话标准计费) 欢迎批评指正

    新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 会员注册 | 产品答疑

    新浪公司 版权所有