批处理修改文件名字

运行环境: linux
编译: gcc
语言: c
接口: linux 系统接口 和c 库函数

运行例子:
 gcc rename.c -o rename
 ./rename -f device/ -r //修改device目录下面的文件,名字从0开始
such as: a.jpg b.jpg ---> 0.jpg 1.jpg 
这个顺序不能确定,不确定是a->0.jpg or b.jpg->0.jpg
./rename -f device/ -p test
//修改device目录下面的文件,名字从加上test前缀开始
such asa.jpg ---> test_a.jpg

文件名字: rename.c

#include <fcntl.h>             // 提供open()函数  
#include <unistd.h>  
#include <stdio.h>  
#include <dirent.h>            // 提供目录流操作函数  
#include <string.h>  
#include <sys/stat.h>        // 提供属性操作函数  
#include <sys/types.h>         // 提供mode_t 类型  
#include <stdlib.h> 
char  newname[100];
char  oldname[100];
static int  cnt = 0;//计数器
/*
function: 在文件名的基础上,添加前缀字符串p,当然了也可以按需修改代码,改成自己想要的。
dir 目录名字
depth 目录深度
p 添加前缀,在已有的文件名字前面,当然了也可以自己修改想改成啥 
*/
void scan_dir(char *dir, int depth, char *p)   // 定义目录扫描函数  
{  

    DIR *dp;                      // 定义子目录流指针  
    struct dirent *entry;         // 定义dirent结构指针保存后续目录  
    struct stat statbuf;          // 定义statbuf结构保存文件属性  
    if((dp = opendir(dir)) == NULL) // 打开目录,获取子目录流指针,判断操作是否成功  
    {  
        puts("can't open dir.");  
        return;  
    }  
    chdir (dir);                     // 切换到当前目录  
    while((entry = readdir(dp)) != NULL)  // 获取下一级目录信息,如果未否则循环  
    {  
        lstat(entry->d_name, &statbuf); // 获取下一级成员属性  
        if(S_IFDIR &statbuf.st_mode)    // 判断下一级成员是否是目录  
        {  
            if (strcmp(".", entry->d_name) == 0 || strcmp("..", entry->d_name) == 0)  
                continue;  

            printf("%*s%s/\n", depth, "", entry->d_name);  // 输出目录名称  
            scan_dir(entry->d_name, depth+4, p);              // 递归调用自身,扫描下一级目录的内容  
        }  
        else {  

            sprintf(newname, "%s/%s_%s",getcwd(NULL, 0), p, entry->d_name);
            sprintf(oldname, "%s/%s",getcwd(NULL, 0),entry->d_name);


           if (rename(oldname, newname)) //output to stdout when rename failed: 
            printf("failed:  %*s%s %s \n", depth, "",oldname , newname); 
        }    
    }  
    chdir("..");                                                  // 回到上级目录  
    closedir(dp);                                                 // 关闭子目录流  
}  

/*
dir 目录名字
depth 目录深度
function: 修改目录下面的文件名字为一个从0自增的数字,如果目录
中已有用数字命名的文件,则会造成冲突,丢失文件。
*/
void rename_dir(char *dir, int depth)   // 定义目录扫描函数  
{  

    DIR *dp;                      // 定义子目录流指针  
    struct dirent *entry;         // 定义dirent结构指针保存后续目录  
    struct stat statbuf;          // 定义statbuf结构保存文件属性  
    if((dp = opendir(dir)) == NULL) // 打开目录,获取子目录流指针,判断操作是否成功  
    {  
        puts("can't open dir.");  
        return;  
    }  
    chdir (dir);                     // 切换到当前目录  
    while((entry = readdir(dp)) != NULL)  // 获取下一级目录信息,如果未否则循环  
    {  
        lstat(entry->d_name, &statbuf); // 获取下一级成员属性  
        if(S_IFDIR &statbuf.st_mode)    // 判断下一级成员是否是目录  
        {  
            if (strcmp(".", entry->d_name) == 0 || strcmp("..", entry->d_name) == 0)  
                continue;  

            printf("the child dir: %*s%s/\n", depth, "", entry->d_name);  // 输出目录名称  
            rename_dir(entry->d_name, depth+4);              // 递归调用自身,扫描下一级目录的内容  
        }  
        else {  
            sprintf(newname, "%s/%d%s", getcwd(NULL, 0), cnt++, strrchr(entry->d_name, '.'));
            sprintf(oldname, "%s/%s", getcwd(NULL, 0), entry->d_name);


           if (rename(oldname, newname)) //output to stdout when rename failed: 
            printf("failed:  %*s%s %s \n", depth, "",oldname , newname); 
//            printf("success:  %*s%s %s \n", depth, "",oldname , newname); 
        }    
    }  
    chdir("..");                                                  // 回到上级目录  
    closedir(dp);                                                 // 关闭子目录流  
}  



int main(int argc, char *argv[])  
{  
   int c ;
   int flag = 0;
   char * dir;
   if (argc > 5 || argc < 4 ) {
      printf("Please useage -f filename -p pattern\n ");
      printf("         or  -f filename -r  \n ");
      return;
   }
   while (--argc > 0 && (*++argv)[0] == '-')
   {    
       while (c = *++argv[0])  
            switch (c) {
            case 'f':
                dir = *(argv+1);
                argv+=2;
                argc-=2;
                flag++; 
                break;
            case 'p':  
               if (flag) {
                    scan_dir(dir, 0, *(1+argv));                           
                    argc--;

                }    
              break;
            case 'r':  
               if (flag) {
                    rename_dir(dir, 0);
                    cnt = 0;
                    argc--;
                }    
              break;
            default: 
                printf("find : illegal option %c\n", c);
                argc = 0;
            }
   }
    return 0;  
}  
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在cmd中修改文件名有两种方法。第一种方法是使用ren命令。你可以打开cmd命令,然后使用cd命令切换到需要修改文件名文件路径。然后输入ren 原文件名文件名修改文件名。例如,ren oldfile.txt newfile.txt。 第二种方法是使用批处理脚本。你可以在需要修改文件名称的文件夹中新建一个bat文件,例如ren_files.bat。然后右键编辑bat文件,输入对应的命令来修改文件名。例如,你可以使用ren命令来批量修改文件后缀,或者使用for命令来根据特定的规则修改文件名。然后保存并双击执行bat文件,即可完成文件名修改。 希望这些方法对你有帮助。如果还有其他问题,请随时提问。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [怎么批量修改文件名](https://blog.csdn.net/weixin_49577940/article/details/121107447)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [cmd自定义批量修改文件名](https://blog.csdn.net/HoD_DoH/article/details/124608505)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值