假設/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 {} \; &