V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
SuperMild
V2EX  ›  分享创造

gof: 一个可扩展的文件处理器(带截图说明)

  •  
  •   SuperMild ·
    ahui2016 · 2021-12-05 09:59:56 +08:00 · 2324 次点击
    这是一个创建于 1109 天前的主题,其中的信息可能已经有所发展或是发生改变。

    gof 是一个纯命令行程序,可以用 Go 语言来写扩展,专门用于处理文件 /文件夹。

    安装方法

    配置好 Go 语言环境后,执行以下命令:

    $ go install github.com/ahui2016/[email protected]
    

    即可完成安装,后续如有新版,只需要修改最后的版本号再执行一次上述命令即可升级。

    使用方法

    -list 参数可以看看已经安装了哪些插件:

    gof-list.webp

    可以看到,目前只有三个插件,但 gof 主要是一个框架,用来方便用户自己写插件的。因为处理文件的需求千差万别,每个人的常用需求都不一样,自带的少量插件主要是我自己要用,并且可以当作例子供参考。

    -help 参数可以查看各个插件的说明:

    gof-swap-help.webp

    在实际执行之前,可以用 -dump 命令来查看任务计划(只显示信息,不会实际操作文件):

    gof-dump-swap.webp

    通过任务计划可确认文件名对不对、参数对不对,并且还会对任务进行初步检查,在上面的截图中可以看到错误提示:需要两个文件名。

    检查无误后,去掉 -dump 即可实际执行命令。另外,-dump 还可以用来生成 YAML 文件:

    gof-swap-yaml.webp

    生成后,以后如果需要重复执行相同的任务,就很方便了,只要用 -f 指定 YAML 文件即可:

    screenshots/gof-f-swap.webp

    在 YAML 文件里,可以组合使用多个任务,会按顺序依次执行:

    # 可以添加多个任务(可以是不同的 recipe ),将会按顺序依次执行。
    all-tasks:
    
    # 第一个任务
    - recipe: swap   
      options:       
        verbose: yes 
      names:         
      - file1.txt
      - file2.txt
    
    # 第二个任务
    - recipe: swap
      options:
        verbose: no  # 第二个任务不显示详细过程
      names:
      - file2.txt
      - file3.txt
    
    # 假设有三个文件
    #    file1.txt 的内容是 111
    #    file2.txt 的内容是 222
    #    file3.txt 的内容是 333
    
    # 用 gof 指定内容如上所示的 YAML 文件运行后,应该变成
    #    file1.txt 的内容是 222
    #    file2.txt 的内容是 333
    #    file3.txt 的内容是 111
    

    制作插件

    以上所示大多数功能,都是 gof 自带的,当你有特殊的需求时可以自行制作插件,非常简单,只需要实现一个接口即可:

    recipe-interface

    其中,Name() 只是返回一个字符串(比如 "swap")。

    Help() 也是返回一个字符串,通常只是一个带注释的 YAML 文件的内容即可,也很简单。(从上文的使用方法中可以看到,YAML 文件可以一个命令轻松生成。)

    Refresh() 用来更新自己,Default() 返回一个默认参数,Prepare() 初始化内部变量,这几个方法都是极容易实现的,下面就是一个真实例子:

    refresh-default-prepare

    Validate() 用来检查用户输入的参数是否正确,比如文件名的数量对不对,还可以在这里测试文件是否真实存在,但在这里不可修改文件,这个命令对应 -dupm 参数,是用来给用户在实际执行之前做初步检查的,因此,Validate 里面的一切操作必须是安全的。

    其中,用户可通过命令行输入参数,也可以通过指定 YAML 文件来输入参数,对命令行和 YAML 文件的处理都是 gof 自带的功能,插件制作者只需要专注于业务逻辑即可。

    Exec() 才是实际处理文件的代码,有了上面的初始化和初步检查之后,写实际代码也会变得轻松,因为比如文件数量对不对、文件是否存在等问题都已经在前面检查过了。

    为什么不用专业的 GUI 软件?

    就我自己的实际使用情况,比如我需要单向同步文件夹,我本来使用 Total Commander, 在制作好一个任务之后,后续每当我需要再同步一次时的操作步骤是:

    1. 点击 "同步" 按钮
    2. 点击收藏夹
    3. 再点击一次选择任务
    4. 点击对比
    5. 点击执行同步
    6. 点击不询问覆盖文件
    7. 最后点击确定才真的执行

    而使用 gof ,在制作好一个任务后,后续每次的操作步骤是:

    1. 进入源头文件的文件夹
    2. 执行命令 gof -f gof.yaml

    就可以了,显然比 GUI 的多次点击更方便。而且,每个 GUI 专业软件的功能都有限,不同的任务可能需要不同的软件,有些需求(比如我需要经常对调两个文件的文件名)也不好找软件。

    不喜欢 Go ?

    当然,Go 的优缺点都比较明显,有人喜欢它的简单,有人嫌弃它用起来太原生态。gof 本身功能不多,代码量很少,参考着 Go 代码用其他语言实现一遍最多只要半天时间,因此有类似需求但又不喜欢 Go 的话完全可以用自己喜欢的语言实现一个类似的程序。

    我自己实际使用感受,命令行与 YAML 的组合既容易编写程序,也能更直观地修改参数(比如输入文件名时特殊字符不需要转义),有一个 YAML 文件也能方便多次重复执行相同任务,还可以把不同的任务组合在同一个 YAML 文件里按顺序执行,是一种很不错的方式。

    源码仓库

    https://github.com/ahui2016/gof

    第 1 条附言  ·  2021-12-05 10:41:31 +08:00
    安装命令的版本写错了,请用 go install github.com/ahui2016/[email protected]
    10 条回复    2021-12-31 09:21:53 +08:00
    godlovesxcjtest
        1
    godlovesxcjtest  
       2021-12-05 14:04:17 +08:00
    如果要实现插件,需要修改 main 的代码,需要自己注册插件,有没有那种和 idea 安装插件一样的方式:不需要修改代码,插件可以动态加载
    SuperMild
        2
    SuperMild  
    OP
       2021-12-05 14:48:22 +08:00
    @godlovesxcjtest 这个用 Go 语言做起来比较麻烦,可能用动态语言做这个需求比较合适。我发现写这个以及它的插件,是个很不错的练手题目,所以我可能会用别的语言重新实现这个项目,到时如果语言合适我再搞动态加载,这个用 Go 做我一时还想不到怎么做。
    ipwx
        3
    ipwx  
       2021-12-05 15:09:02 +08:00
    这种小工具更适合用 Python 做 —— 插件也容易
    SuperMild
        4
    SuperMild  
    OP
       2021-12-05 15:32:18 +08:00
    @ipwx 确实,我已经想用 Python 来重写了…
    whitedroa
        5
    whitedroa  
       2021-12-05 17:49:49 +08:00
    @SuperMild 是的,Go 语言实现起来确实比较麻烦。我现在在搞一个自己的开源项目,插件不知道怎么实现。目前想到的唯一方法和楼主的方式差不多,项目目录新增一个 plugins 的目录,里面可以自由添加插件的代码,区别是插件需要自己实现 init 方法并且进行 register ,这样可以不用修改原来项目的任何代码,直接编译就能生成自己的程序。楼主如果以后有什么好的想法可以一起交流。
    SuperMild
        6
    SuperMild  
    OP
       2021-12-05 20:37:03 +08:00
    @whitedroa 用 go generate 应该可以做得更自动化一点,但我有点嫌麻烦…
    rapiz
        7
    rapiz  
       2021-12-07 16:03:06 +08:00
    支持一下,我见到的非编程背景的人有时候会有这种需求,或许这个工具对于解决外行各种个性的办公自动化问题有帮助
    Akkuman
        8
    Akkuman  
       2021-12-08 12:13:09 +08:00 via Android
    楼上的需求可以用 gopher-lua 这类东西来做插件体系
    SuperMild
        9
    SuperMild  
    OP
       2021-12-08 15:34:20 +08:00
    @rapiz 感谢支持

    @Akkuman 感谢推荐,我已经着手用 Python 改写了,但你的推荐也很不错,也许有类似需求的人看到会有帮助。
    SuperMild
        10
    SuperMild  
    OP
       2021-12-31 09:21:53 +08:00
    @godlovesxcjtest 我用 Python 改写好了,插件可以动态加载 https://v2ex.com/t/825412
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2694 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 15:31 · PVG 23:31 · LAX 07:31 · JFK 10:31
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.