..

day20201013 ---批量文件名修改小工具

经常有批量修改文件名的需求,感觉网上找的不好用,自己整一个,C语言不会,网上找的代码拼凑了一个小工具。点我下载

 

 

用法:

 

 

 

代码:

#include <iostream>
#include <cstring>
#include <io.h>
#include <regex>  
#include <string>  

using namespace std;

void listFiles(const char * dir, char * old_pattern, char * new_pattern);
void rename_the_file(string workdir, char * fileName, char * old_pattern, char* new_pattern);
int recursion = 0;

int main(int argc, char *argv[], char *envp[]){

    if (argc == 5){
        recursion = 1;
    }
    /*
    argv[1],workdir
    argv[2],old pattern
    argv[3],new pattern
    argv[4],whether recursion subdir
    */
    if (argc < 4){
        cout << "USAGE: renamer <workdir> <old_pattern> <new_pattern>" << endl;
        return 0;
    }
    else{
        cout << "----------------------" << endl;
        cout << "WORKDIR: \t\t\""<< argv[1] <<"\"\nOLD_PATTERNN: \t\t\"" << argv[2] << "\"\nNEW_PATTERN: \t\t\"" << argv[3] <<"\""<< endl;
        cout << "----------------------" << endl;

        listFiles(argv[1],argv[2],argv[3]);
        return 0;
    }
}


void rename_the_file(string workdir,char * fileName,char * old_pattern, char* new_pattern){
    cout << "处理:" << fileName << " \n";
    string ee(old_pattern);
    regex e(ee);
    smatch m;
    string name(fileName);
    string newName = string(new_pattern);

    bool found = regex_search(name, m, e);
    if (found){
        cout << name << "\t\t  -----> \t\t" << workdir;
        string tmp = regex_replace(name, e, newName);
        rename((workdir + name).c_str(), (workdir + tmp).c_str());
        cout << tmp << endl;

    }
}

void listFiles(const char * dir, char * old_pattern, char * new_pattern){
    char dirNew[200];
    strcpy(dirNew, dir);
    // 在目录后面加上"\\*.*"进行第一次搜索
    strcat(dirNew, "\\*.*");    

    intptr_t handle;
    _finddata_t findData;

    handle = _findfirst(dirNew, &findData);
    // 检查是否成功
    if (handle == -1)
        return;

    do{
        if (findData.attrib & _A_SUBDIR){
            if (strcmp(findData.name, ".") == 0 || strcmp(findData.name, "..") == 0)
                continue;

            if (recursion == 1){
                cout << findData.name << "\t<dir>\n";
                // 在目录后面加上"\\"和搜索到的目录名进行下一次搜索
                strcpy(dirNew, dir);
                strcat(dirNew, "\\");
                strcat(dirNew, findData.name);
                listFiles(dirNew, old_pattern, new_pattern);
            }

        }else{
            rename_the_file(string(dir) + "\\", findData.name, old_pattern, new_pattern);
        }
            
    } while (_findnext(handle, &findData) == 0);
    // 关闭搜索句柄
    _findclose(handle);
}
View Code

 

 

 

示例:

 

 比如我想把前面重复的数字去掉,把后面括号和括号内的东西去掉可以执行命令:

renamer C:\Users\Administrator\Desktop\test  "\.\d+"  ""
renamer C:\Users\Administrator\Desktop\test  "\(Av\d+\,P\d+\)"  ""
View Code

 

 

 

 

 

 


 

 

 

如果您使用python3,

欢迎pip install  just-rename,用法和这个renamer一样。

通过just-rename 进行文件名批量修改。

 

posted @ 2020-10-13 10:56  罗浩楠  阅读(129)  评论(0)    收藏  举报
..