最好的快餐式脚本工具

2011-09-07 20:30:37 +08:00
 obiwong
最近要对一堆文件进行重命名操作,文件名是类似于

xxx01.img
xxx02.img
xxx03.img
...

的形式,要改成

01.img
02.img
03.img
...


第一个念头是写一个脚本搞定这件小事,伪代码大概是下面这个样子:

for-each file in all-files-in-current-dir do
.. basename = get-basename-of( file )
.. get-digital-part-of-filename( basename )
.. rename(only-digital-filename, basename)

然后我估了一下写成 bash 或 python 脚本要花的时间,写代码大概用5分钟左右,调试大概用5分钟左右,共10分钟。还有更快的方法吗,于是我想到了emacs,用emacs的按键宏完成这件事,从"写"脚本到运行完脚本,只花了不到1分钟。

我知道还有其它多得数不清的编辑器也有按键宏录制功能,但它们只是一个编辑器,仅此而已。Emacs不止是一个编辑器,它还是一个操作系统,操作系统无所不能,因此Emacs的按键宏功能也无所不能。

录制这个键盘宏只需要不到20秒的时间:

1. 进入dired模式,定位到要改名的第一个文件处
2. C-x (
3. C-SPC C-f C-f M-w R C-y .jpg CR C-n
4. C-x )

定义就完成了,要执行100次的话: C-u 100 C-x e。

宏相对于脚本的优势在于,录制宏的过程既是"写"脚本的过程,也是调试脚本的过程,并且这一切都是可视化的: 你能直接看到你的每一步操作会带来什么样的效果。

宏还有一个优点就是编写简单,只需要花几十秒就能录制出一个实用的工具,用完直接把它扔掉。既然录一个宏只需要十几秒,那为什么还要花时间给它加注释、取名子、然后归档到自己的脚本工具箱里去呢?

当然,相对于脚本键盘宏有很多缺点: 不可读、不能编辑、只能处理简单逻辑等,这有点象快餐: 不象正餐那样有营养、好吃,但能为你成倍地节约时间和精力,让你把时间精力放到更有价值地事上去。
6895 次点击
所在节点    Emacs
24 条回复
dreampuf
2011-09-07 21:13:17 +08:00
我怎么觉得用python解析器,不到30s就能解决.

这种人云亦云,各有所好的东西,没有"最"的吧.
obiwong
2011-09-07 21:14:39 +08:00
@dreampuf 你写代码和调试要花多少时间?
ssword
2011-09-07 21:22:31 +08:00
还没调试: Dir['*.img'].each{ |fn| `mv #{fn} #{fn.gsub(/\D+(\d+.jpg)/, '\1')}` }
obiwong
2011-09-07 21:35:39 +08:00
@ssword 不懂ruby。多少时间?
eth2net
2011-09-07 22:47:45 +08:00
rename命令不可以么?
fly2never
2011-09-07 23:14:54 +08:00
就lz这个需求 vim录制一个宏甚至一个%s全局替换都是可以的
不过emac比vim强大倒是真的
est
2011-09-07 23:34:28 +08:00
@eth2net 对啊,windows的cmd下直接 ren xxx??.img ??.img 就搞定了。

Linux下办法更多。
qiao
2011-09-07 23:54:07 +08:00
@est 好久不用windows,不过依稀记得貌似在windows中全选所有文件,然后把第一个文件改名01.img,后面所有文件就自动重命名为 02.img 03.img ... 了
L42y
2011-09-08 00:26:05 +08:00
dired 不是有 edit mode 么?像编辑文件一样编辑文件名列表。
raptium
2011-09-08 01:00:01 +08:00
Automator 也可以啊
dreampuf
2011-09-08 17:18:52 +08:00
@obiwong 这种需求真的不需要调试.你无非想表达某些shell的便捷.Python作为默认继承在系统内部的脚本,就是干许多零散细碎的活的.

需求在那里,不增不减.仅仅看哪门工具顺手.
obiwong
2011-09-09 10:08:33 +08:00
看了所有回复,很有意思,因为大部分都跑题了:


楼主:emacs的键盘宏功能虽然不强大,但处理简单的事务比脚本节约时间。

@dreampuf 楼主人云亦云, 我爱python

@ssword Dir['*.img'].each{ |fn| `mv #{fn} #{fn.gsub(/\D+(\d+.jpg)/, '\1')}` }

@eth2net windows改名功能很强大

@fly2never vim也可以

@est windows改名功能很强大, Linux下办法更多

@qiao windows改名功能很强大

@L42y 为什么不用dired的edit mode

@raptium Automator 改名功能很强大
ssword
2011-09-09 10:21:03 +08:00
无知者无畏。
Kymair
2011-09-09 11:45:14 +08:00
@obiwong 大家只是想表明,对于你提出的这个问题,用自己顺手的工具,几乎都不需要一分钟。

你是一个Emacs user,你觉得你可以用Emacs不到一分钟解决,但是如果是一个连Emacs基本操作都不知道的人来呢?你觉得用Python, Ruby或者Shell来解决这个问题,需要“调试”,但如果是一个天天泡在命令行下的人来呢?

我以前总觉得我用Vim处理文本非常快,后来看到我的Team Lead用Excel,也能在同样的时间里达到同样的效果。其实做一件事情,写一个程序,最重要的是脑子里知道怎么做。如果一个新手,连“循环”的概念都没有,可能用啥工具他也很难完成你提到的这个任务
eth2net
2011-09-09 12:57:47 +08:00
@obiwong 我说的rename是linux命令=,=
obiwong
2011-09-09 13:48:44 +08:00
@Kymair 所以我才说,大部分人都跑题了。

emacs的键盘宏功能虽然 *不* 强大,但 *处理简单的事务* 比 *脚本* 节约时间。

这才是我所表达的。改名只是一个例子,现实中还有其它五花八门的情况,既不能靠简单的一条命令完成,也不值得去写一个脚本。这也是我称之为 “快餐” 的原因。

至于并非所有人都会emacs的问题,我发帖所在的node就说明了一切。

@eth2net 抱歉你表达rm的方式太隐讳了我当时没看懂
obiwong
2011-09-09 14:10:48 +08:00
@eth2net 还真有rename这条命令,一直用mv, 看来我前几年linux白用了。
Kymair
2011-09-09 14:53:46 +08:00
@obiwong 大家看懂了你要表达什么,然后大家纷纷表达,emacs键盘宏解决简单的事物不一定比*脚本*节约时间,很多种其他的方式都是几秒钟解决问题,全看个人喜好和习惯 :)
dreampuf
2011-09-09 16:16:55 +08:00
@obiwong 你是非得要emacs和python比肩么? 你可能对python不熟,但是我敢断言以你使用emacs的智商,绝对可以在几个小时内掌握python,随意在一分钟内解决这种"不能靠简单的一条命令完成,也不值得去写一个脚本"的任务.

不是每个脚本都要抽取通用模块,让以后复用.解析器里就可以执行完后甩掉.

由于你使用的是emacs,上面的"python"可以替换为任意字符.
bhuztez
2011-09-09 16:22:20 +08:00
吵死了,这种情况只发生一次,用自己最熟悉的工具最快

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/17838

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX