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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM