AIX7.1删除大批量文件(百万级、千万级)
假设/data/test目录下含有数百万上千万的文件需要删除,可以选择的方式如下:
1.如果文件名不包含空白符、引号等特殊字符,则可以使用如下命令:
find /data/test -type f |xargs rm -f
2.如果文件名包含空白符、引号等特殊字符,则在linux中使用如下命令:
find /data/test -type f -print0 |xargs -0 rm -f
而我所用的AIX7.1平台的xargs不支持-0选项,于是决定采用方式3:c语言写段代码删除。
3.c语言删除代码
该代码删除800万量级的文件时可以,删除2000万量级的文件时出现错误:Value too large to be stored in data type,于是又回到使用find ... rm的方法,具体命令参加方法四。
以下代码只假设要删除的目录中全是要删除的文件;如果有子目录,应该做递归删除;如果有条件的删除,可以使用stat函数获取每个文件的信息,然后判断文件信息是否满足删除条件再进行操作。
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <sys/types.h> 4 #include <dirent.h> 5 6 #define MAX_FILE_NAME_LEN 256 7 8 void clean(const char *dirName,int max){ 9 DIR *dir; 10 struct dirent *ent; 11 int n=0; 12 char fullFileName[MAX_FILE_NAME_LEN]; 13 14 dir=opendir(dirName); 15 if(dir==NULL){ 16 printf("open dir error:%s\n",dirName); 17 return; 18 } 19 while((n<max) && ((ent=readdir(dir))!=NULL) ){ 20 if(strcmp(ent->d_name,".")==0 || strcmp(ent->d_name,"..")==0 ) 21 continue; 22 sprintf(fullFileName,"%s/%s",dirName,ent->d_name); 23 24 if(remove(fullFileName)==0) 25 printf("delete file ok: %s\n",ent->d_name); 26 else 27 printf("delete file fail: %s\n",ent->d_name); 28 n++; 29 } 30 printf("%d files deleted.\n",n); 31 closedir(dir); 32 } 33 void main(int argc,char *argv[]){ 34 char dirName[MAX_FILE_NAME_LEN]="/data/test"; 35 int max=10; 36 if(argc>1) 37 strcpy(dirName,argv[1]); 38 if(argc>2) 39 max=atoi(argv[2]); 40 clean(dirName,max); 41 }
4.使用find + rm命令删除2000万级的文件
find /data/test -type f -exec rm {} \; &