批量文件重命名
很多时候我们会下了很多文件,比如图片文件,下载的文件名字一般都比较乱,我们整理时,使用编号是个不错的选择,比如 1.jpg、2.jpg、3.jpg 等。一个一个重命名在数据量小的时候也无所谓,但是对于上百个文件甚至上千个,希望重命名,这就是件非常麻烦的事了。
这里写了个小程序,使用 UNIX/Linux 下的 api,打开目录,遍历文件,然后一一重命名,按编号递增顺序;这里也让名字的长度一致,比如都是 3 位,这样的话就有 010.jpg、099.jpg 这样的名字(编号前面补空缺的 0 的一个原因是:在我们选择按名字排序的时候,排序结果和编号顺序一致,否则 9.jpg 会在 10.jpg 的后面,自己猜原因,O__O"…)。
为了提供一定的灵活性,目录、文件后缀、起始编号、文件名长度可以通过参数设置。
说明文档
多文件重命名:
功能:将一个文件夹下的所有文件重命名为数字有序的名字,也就是形如 000001.jpg、000002.jpg、000003.jpg、...、001004.jpg、001005.jpg 等;
使用方法:
> rename -h # 查看帮助,或是 rename --help 查看;
> rename D:\\image\\gif .gif 10 3 # 将 D:\image\gif 文件夹下的所有 .gif 文件重命名为 010.gif、011.gif、012.gif ... 等;
注意:
1) 请一定要提供文件夹路径,其中路径中的 \ 要使用两次代表一个 \ ;
2) 其他参数可以省略,默认是文件类型是 .jpg,默认开始数字是 0,默认长度是 6 位;
实例:
1) > rename D:\\image\\gif
重命名目录下的 .jpg 文件;第一个文件名是 000000.jpg;依次递增;
2) > rename D:\\image\\gif .png 1000
重命名目录下的 .png 文件;起始编号是 1000, 也就是第一个文件名字是 001000.png,依次递增;
3) > rename D:\\image\\gif .png 1000 4
重命名目录下的 .png 文件;起始编号是 1000,长度是 4,也就是说第一个文件名字就是 1000.png,依次递增;
源代码
如果是程序猿的话,可能对源码比较感兴趣,否则的话,可能直接的 exe 才有帮助。下面是源代码:
- #include <stdio.h>
- #include <string.h>
- #include <stdlib.h>
- #include <sys/types.h>
- #include <dirent.h>
- #define NMAX_FILE_NAME 256
- int main (int argc, char*argv [])
- {
- constchar*pwd =""; // work directory
- constchar*suffix =".jpg"; // file ext name
- int cur =0; // current number
- int length =6; // new file name length
-
- char old_name [NMAX_FILE_NAME ], new_name [NMAX_FILE_NAME ];
-
- DIR *dir ;
- struct dirent *ent ;
-
- if(argc >=2&&(strcmp(argv [1], "-h")==0 strcmp(argv [1], "--help")==0)){
- printf("prog <directory = > <suffix = .jpg> <start_number = 0> <length = 6> (after = is default value.)\n");
- return0;
- }
- switch(argc ){
- case5:
- length =atoi(argv [4]);
- case4:
- cur =atoi(argv [3]);
- case3:
- suffix = argv [2];
- case2:
- pwd = argv [1];
- default:
- break;
- }
-
- if(dir = opendir (pwd )){
- while(ent = readdir (dir )){
- //printf("%s\n", ent->d_name); // one file name
- if(strstr(ent ->d_name, suffix )!=NULL){ // is specific file ?
- sprintf(old_name, "%s\\%s", pwd, ent ->d_name ); // get old name
- sprintf(new_name, "%s\\%0*d%s", pwd, length, cur ++, suffix ); // get new name
- printf("%s %s\n", old_name, new_name );
- if(rename(old_name, new_name )!=0){
- perror("rename failed ! ");
- }
- }
- }
- closedir (dir );
- }else{
- perror("directory open failed ! ");
- return1;
- }
- return0;
- }
--转自
该贴由koei123转至本版2015-6-1 15:09:19