V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
obiwong
V2EX  ›  Emacs

最好的快餐式脚本工具

  •  
  •   obiwong · 2011-09-07 20:30:37 +08:00 · 6642 次点击
    这是一个创建于 4586 天前的主题,其中的信息可能已经有所发展或是发生改变。
    最近要对一堆文件进行重命名操作,文件名是类似于

    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。

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

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

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

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

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

    需求在那里,不增不减.仅仅看哪门工具顺手.
    obiwong
        12
    obiwong  
    OP
       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
        13
    ssword  
       2011-09-09 10:21:03 +08:00
    无知者无畏。
    Kymair
        14
    Kymair  
       2011-09-09 11:45:14 +08:00
    @obiwong 大家只是想表明,对于你提出的这个问题,用自己顺手的工具,几乎都不需要一分钟。

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

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

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

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

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

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

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

    由于你使用的是emacs,上面的"python"可以替换为任意字符.
    bhuztez
        20
    bhuztez  
       2011-09-09 16:22:20 +08:00
    吵死了,这种情况只发生一次,用自己最熟悉的工具最快
    obiwong
        21
    obiwong  
    OP
       2011-09-11 00:26:09 +08:00
    @Kymair "很多种其他的方式都是几秒钟解决问题" 你是在写几行脚本,调试,运行后才得出这样的结论的吗?

    @dreampuf 我提的问题你还没回答我呢

    @ssword 就事论事,别搞人身攻击。
    ssword
        22
    ssword  
       2011-09-11 08:03:54 +08:00
    @obiwong 幼稚。
    obiwong
        23
    obiwong  
    OP
       2011-09-13 12:13:12 +08:00
    @ssword 要证明自己对,贬低别人不是个好办法。另外,说话故意省略主谓语也不是,这只会让人觉得你大脑额叶或颞叶受损
    obiwong
        24
    obiwong  
    OP
       2011-09-13 12:27:47 +08:00
    @ssword 如果您真的是额叶颞叶功能性缺失,我为我的无意冒犯致以诚挚的歉意,真的,我不歧视残疾人
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5852 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 01:57 · PVG 09:57 · LAX 18:57 · JFK 21:57
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.