将Comiket物的文件名格式统一化的脚本

又到了Comiket大潮,抓下来的文件的名字总是格式不统一,按照文件名排序来查看很不方便。于是又到了出动Ruby的时间~

(每次到批量重命名文件的时候我的第一反应就是打开irb……)

这次的脚本在好几个类别的目录下都能用,所以顺便记下来。

脚本作用:将类似"(Cxx)(item_type)[circle_name] item_name"的文件名中开头部分的空格调整到:前缀标签间不包括空格,标签整体与后面的文件名之间留一个空格。普通文件和目录都是重命名的目标。不符合这种带有两组圆括号和一组方括号为前缀标签的文件则不在重命名目标范围内。我一般是用另外的脚本来把顺序都倒到这个顺序上然后再一起抽掉空格。

限制:如果文件名中出现了在当前系统locale下无法显示出来的字符,那么那个文件的重命名会失败;重命名失败不会影响后续循环,失败的文件名会显示到stderr。反正有特殊字符的文件/目录不会很多,暂时就手工修改算了 OTL

Ruby 1.8自身的编码是有点问题,而Ruby 1.9的字符串虽然能用UNICODE,但在执行这种操作的时候似乎还是处理不了。怪哉,可能我没写对还是怎样。回头再试试看。

Ruby代码

#!/usr/bin/env ruby

def reformat_comiket_folder(dir='.')
  Dir.entries(dir).each do |p|
    begin
      if p =~ /^\(([^)]+)\)\s*\(([^)]+)\)\s*\[([^\]]+)\]\s*(.+)$/
        File.rename p, "(#{$1})(#{$2})[#{$3}] #{$4}"
      end
    rescue SystemCallError
      $stderr.puts 'IO failed: ' + $!
    end
  end
end

if __FILE__ == $0
  reformat_comiket_folder ARGV[0] || '.'
end

其实用这脚本心里有点痒……又想起之前在写的重命名工具了。找个时间把它写完就好了 T T

当然咯,用C#来写这个程序就不会出现编码问题。采用跟上面相似的逻辑,重写为:

C#代码

using System;
using System.IO;
using System.Linq;
using System.Text.RegularExpressions;

sealed class ReformatComiketFiles {
    static bool TryGetRenameName(
        Regex pattern,
        string input,
        string format, // format items in this param correspond to match.Groups[1..$]
        out string result ) {

        var match = pattern.Match( input );
        if ( match.Success ) {
            var str = string.Format( format,
                                     match.Groups
                                         .Cast<Group>( )
                                         .Skip( 1 )
                                         .Select( g => g.Value )
                                         .ToArray( ) );
            result = str;
            return str != src; // using a local variable here saves an indirect read
        } else {
            result = input;
            return false;
        }
    }

    static void Main( string[ ] args ) {
        DirectoryInfo root;
        if ( 0 < args.Length ) {
            root = new DirectoryInfo( args[ 0 ] );
        } else {
            root = new DirectoryInfo( Environment.CurrentDirectory );
        }
        var pattern = new Regex( @"^\(([^)]+)\)\s*\(([^)]+)\)\s*\[([^\]]+)\]\s*(.+)$" );

        foreach ( var dir in root.GetDirectories( ) ) {
            string dest = null;
            if ( TryGetRenameName(
                    pattern,
                    dir.Name,
                    "({0})({1})[{2}] {3}",
                    out dest ) ) {
                Console.WriteLine(dest);
                dir.MoveTo( Path.Combine( dir.Parent.FullName, dest ) );
            }
        }

        foreach ( var file in root.GetFiles( ) ) {
            string dest = null;
            if ( TryGetRenameName(
                    pattern,
                    file.Name,
                    "({0})({1})[{2}] {3}",
                    out dest ) ) {
                Console.WriteLine( dest );
                file.MoveTo( Path.Combine( file.DirectoryName, dest ) );
            }
        }
    }
}

试了下,似乎都能行。运行环境是.NET Framework 3.5 SP1。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索string
, 文件
, 脚本
, otl
, 文件名
, 空格
, otl stream
pattern
shell脚本获取文件名、批量修改文件名脚本、bat脚本修改文件名、bat脚本获取文件名、shell脚本读取文件名,以便于您获取更多的相关知识。

时间: 2024-08-03 10:34:13

将Comiket物的文件名格式统一化的脚本的相关文章

将Comiket物的文件名格式统一化的脚本(F#版)

既然Ruby的简单版和C#的版本都写了,写个F#版来对比一下也不错. 下面的程序逻辑基本上与前一篇的C#版类似,只是在如何抽取出文件名中的各部分的实现用了不同的划分方式:C#版的TryGetRenameName()方法更倾向于直接支持不同的pattern和format:F#版则是直接把pattern和format硬编码到parseFilename和getReformattedFilename函数里了.到底该怎么划分好我也不太肯定,不过在这么小的程序里划分方式好不好体现不出来,或许也不值得多想吧?

word2016问过文档怎么合并成一个并设置格式统一?

word2016问过文档怎么合并成一个并设置格式统一?   1.首先建立一个Word文档,以便于将需要整个的文档归入其中 2.打开文档,在[插入]工具下打开[对象]的下拉选框. 3.下下拉复选框中选择[文件中的文字] 4.然后在弹出的对话框中,选择需要合并的文档(不要把新建的文档选中了) 5.在选择文档的时候需要注意的是,如果想按照一定顺序合并到新的文档的话,那在选择的时候就要按照顺序选择,否则文档问按照你选择的顺序排列起来. 6.此时合并进来额文档可能因为之前编辑的时候才用了不同的格式,我们需

检索换新装 视频图片检索端统一化分享

  起初浏览图片和视频的检索页面,发现页面有很多可以改进的地方, 如:布局结构.间距.字色.筛选.TAB.缩略图大小.行数.列数,RS样式等. 接着参看了大量的竞品,讨论,沟通,获得了不少收获和启发,并产出一些最初的设计想法. 在结构布局.缩略图排列.筛选区域.交互效果.颜色样式等方面都作出不同尝试,通过产出.讨论,抛出问题. 抛出的问题: 产品页面多年的沉淀,用户习惯不容忽视,图片和视频的用户在浏览须有上有所差异. 共同的特点: 相同的都是检索端,结构布局大致相同. 当搜索人物类query时会

用户体验部无线端APP统一化路程

一.为什么要做? 最初我们只有一个产品,产品就是品牌,品牌也就是这个产品,但后来产品多了,丰富了,开始强调差异化,我们需要提取更多共性的特征到品牌塑造中.品牌也就自然会独立出来,作特定考虑研究.品牌的核心仍然是产品,尤其在快速变化的互联网.移动互联网品牌化还不够理想的情况下,做好产品自然是给品牌加分的事情. 系统化的思考产品,更多的横向关联的推衍及提取共性,无疑会给产品迭代带来好处,会使用户认知与使用降低成本,功能传承性得到体现,通过这样一系列共性的传递,从而树立品牌特征,形成我们独特的语言.

微软化繁为简 揭开Windows统一化的神秘面纱

最近关于微软的消息不绝于耳,大幅裁员的计划让整个科技界都震惊不已.不过微软目前也受到苹果谷歌等公司的夹击,再不做些改变前景确实堪忧.CEO纳德拉就对微软做了大手术,不仅大胆解雇众多员工,还要统一微软的各个Windows平台来提高效率.下面我们就来了解微软这一统一计划,看看与我们想象的有什么出入.微软新任CEO萨蒂亚·纳德拉微软的高管们在过去的一年多时间努力解释Windows系统的发展方向,而微软CEO萨蒂亚·纳德拉(Satya Nadella)也告诉媒体和分析师,下一代的Windows系统将整合

两岸咖啡的连锁之路:统一化+标准化+差异化

每天金梅央坐在杭州两岸咖啡总部办公室便可以通过http://www.aliyun.com/zixun/aggregation/13617.html">信息管理系统清晰地看到全国所有门店的经营状况.打烊时间.收支报表.进销存等状况."在530家两岸咖啡店中,大概每天是15万左右的客流,一年累积下来有四五千万人."她介绍说.现在,两岸咖啡西餐连锁实行多品牌运作,除了有两岸咖啡,还有日本料理以及定位高端的两岸铁板烧,从早上十点营业到半夜两三点. 2003年,金梅央的两岸咖啡是

Linux集群和自动化维1.4.3 CentOS 6.4 x86_64系统最小化优化脚本

1.4.3 CentOS 6.4 x86_64系统最小化优化脚本  CentOS 6.4 x86_64系统最小化优化脚本,脚本内容如下所示(请注意下面的代码中有中文注释内容,如果是放在线上运行时则要注意): #!/bin/bash #系统基础升级 wget http://mirrors.163.com/.help/CentOS6-Base-163.repo cd /etc/yum.repos.d/ mv CentOS-Base.repo CentOS-Base.repo.bak mv CentO

求正则表达式:上传文件的文件名格式

问题描述 通过UpLoad的控件上传,得到文件路径.例如E:xxxas$.txt需要一正则表达式来验证文件名as$.txt仅包含英文字母和数字,如何实现? 解决方案 解决方案二:stringstr=@"xxxass34.txt";stringstrReg=@".+\[^.][a-zA-Z0-9]+.txt$";Response.Write(Regex.Match(str,strReg,RegexOptions.IgnoreCase).Success);解决方案三:那

IrisSkin2.dll控件引用之后,所有控件格式统一,如果局部想取消显示自定义格式,怎么办呢?

问题描述 补充:比如说我现在为Label控件的字体颜色设置为红色,但是我设置之后没有显示,还是套用统一格式的字体颜色,如何取消呢,显示我自定义的颜色呢.各位高手,谢谢大家了! 解决方案 解决方案二:这个能吗?不懂,帮顶.解决方案三:取消相应控件上的皮肤即可