用Matlab给整个文件夹下的文件分别重命名

从读硕士以来一直用“期刊名字+年份+论文名字”的方式来给所有PDF文档命名,后来发现其实把年份放在前面会更好,一方面对于年份的记忆其实比期刊名字更强烈,在搜寻一篇论文时总是先想到年份,再想到期刊。另一方面,也是更主要的,是由于这样的命名方式,可以在文档中一目了然地看到这个领域(我是按领域来细分子文件夹的)在不同年份的发文量,也会对某篇论文在这个领域的发表先后有一个很直观的印象。但是因为收集的论文越来越多(超过1000篇),所以总是迟迟没有动手修改。

今天决定批量修改一次,用最容易操作的Matlab。
我之前的命名格式是“期刊名年份-论文名字”,比如“Nature2015-Deep Learning”,也有少部分是“Nature2015_Deep Learning”,我希望修改后的名字统一变为”2015-Nature-Deep Learning",所以代码的主要思路就是先找出文件名中的分隔符“-”或“_“,然后把前面的"Nature"、“2015”和后面的“Deep Learning"分别提取出来做重新排列。

下面是代码:

dbstop if error
% clear all
dir_struct = dir('*.pdf');%调出当前目录下所有的pdf文件信息

for i = 1:length(dir_struct)%遍历每一个文件
    name = dir_struct(i).name;
    if isletter(name(1)) %因为有些年代太过久远的文档我在命名时直接用年份,没有加期刊名,所以要先确认当前文件名是以期刊名字开头的
        separator = find(name=='-');%寻找文件名中的“-”
        if isempty(separator)
            separator = find(name=='_');%如果没有就找“_”
            if isempty(separator)
                continue%如果都没有,就说明这个文件名不是我们要修改的类型,直接跳到下一个文件
            end
        end
        index = separator(1);%提取出第一个分隔符的位置
        journal = [];%存放期刊名字
        year = [];%存放年份
        article = [];%存放论文名字
        for j = 1:index-1%遍历分隔符前面的每个字符
            if isletter(name(j))%如果是字母,就放到期刊名字里
                journal = [journal,name(j)];
            else%如果是数字,就放到年份里
                year = [year,name(j)];
            end
        end
        for j = index+1:length(name)%遍历分割符后面的内容,存为期刊名字
            article = [article,name(j)];
        end        
        old_name = name;
        new_name = [year,'-',journal,'-',article];
        if ~strcmpi(old_name,new_name)%可能改了一部分文件之后报错,调整后重新运行程序,所以要先把那些已经修改过名字的文件过滤掉,否则matlab会报错
            movefile(old_name,new_name)
        end
    end
end

网上有很多教程都是调用windows的命令来重命名,但是考虑到跨平台的兼容性,我最后用了matlab自己的一个函数movefile来进行重命名操作。

有什么问题欢迎留言。

你可能感兴趣的:(用Matlab给整个文件夹下的文件分别重命名)