最好的快餐式脚本工具 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
obiwong
V2EX    Emacs

最好的快餐式脚本工具

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

    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
      &nbs; 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     Solana     1335 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 17:13 PVG 01:13 LAX 10:13 JFK 13:13
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86