資源簡介
仿照unix操作系統中的find命令,實現自己的一個find命令。find命令從指定的目錄下開始,遞歸地查找指定文件。其命令格式如下:
find PATH -option 參數 [-print] [-exec 命令 {} \;]
PATH:查找的起始目錄。
-option 參數:用來控制搜索方式,具體如下(以下只列出最常用的):
??? -name "文件":指定要查找的文件名,可以有通配符?*等。
??? -prune 目錄:指出搜索時不搜索該目錄。
??? -mtime +n或-n:按時間搜索,+n:表示n天之前修改過的文件;-n:表示今天到n天前之間修改過的文件。
??? -ctime +n或-n:也是按時間查找,+n:表示n天之前創建的文件;-n:表示今天到n天前之間創建的文件。
??? -print:將搜索結果輸出到標準輸出。
可選的實驗1:實現-exe選項。
??? -exec:對查找到的每一個結果實行指定的程序。格式如下:
??? -exec 程序名
提示:執行指定的程序可以創建一個進程執行
代碼片段和文件信息
#include/*?{{{?*/
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
/*?}}}?*/
//全局變量/*?{{{?*/
#define?TRUE?1
#define?FALSE?0
#define?MAX_RESULT?500//最多能存儲多少個查詢結果
int?nameToggle=FALSE;//是否開啟-name選項
int?pruneToggle=FALSE;//是否開啟-prune選項
int?mtimeToggle=FALSE;//是否開啟-mtime選項
int?ctimeToggle=FALSE;//是否開啟-ctime選項
int?printToggle=FALSE;//是否開啟-print選項
int?execToggle=FALSE;//是否開啟-exec選項
int?namePosition=0;//-name是第幾個參數
int?prunePosition=0;//-prune是第幾個參數
int?mtimePosition=0;//-mtime是第幾個參數
int?ctimePosition=0;//-ctime是第幾個參數
int?execPosition=0;//-exec是第幾個參數
char*?result[MAX_RESULT];//存儲查詢結果
int?resultPosition=0;//result數組下標
/*?}}}?*/
int?matchName(char*?stringchar*?pattern){/*?{{{?*/
regex_t?reg;//正則表達式
if(regcomp(®patternREG_NOSUB|REG_ICASE)!=0){
perror(“compile?regex?error“);
printf(“regex:%s\n“pattern);
exit(EXIT_FAILURE);
}
int?status=regexec(®string(size_t)0NULL0);
regfree(®);
if(status==0)
return?TRUE;
return?FALSE;
}/*?}}}?*/
int?matchMtime(struct?stat?stat_bufint?n){/*?{{{?*/
time_t?now=time(NULL);
time_t?mtime=stat_buf.st_mtime;
/*printf(“********************\n“);
printf(“test?mtime:\t%s\n“ctime(&mtime));
printf(“time?now:\t%s\n“ctime(&now));
printf(“difftime:\t%f\n“difftime(nowmtime));
printf(“day:\t%d\n“(int)difftime(nowmtime)/(60*60*24));
printf(“********************\n“);*/
int?day=(int)difftime(nowmtime)/(60*60*24);//上次修改距今天的天數
if(n<0){//搜索今天到n天前之間修改過的文件
if(day+n<0) return?TRUE;
}
else{//搜索n天之前修改過的文件
if(day>=n) return?TRUE;
}
return?FALSE;
}/*?}}}?*/
int?matchCtime(struct?stat?stat_bufint?n){/*?{{{?*/
time_t?now=time(NULL);
time_t?ctime_=stat_buf.st_ctime;
int?day=(int)difftime(nowctime_)/(60*60*24);//自文件創建到今天的天數
/*printf(“********************\n“);
printf(“test?ctime:\t%s\n“ctime(&ctime_));
printf(“time?now:\t%s\n“ctime(&now));
printf(“difftime:\t%f\n“difftime(nowctime_));
printf(“day:\t%d\n“(int)difftime(nowctime_)/(60*60*24));
printf(“********************\n“);*/
if(n<0){//今天到n天前之間創建的文件
if(day+n<0)?return?TRUE;
}
else{//n天前創建的文件
if(day>=n) return?TRUE;
}
return?FALSE;
}/*?}}}?*/
char*?getPath(char*?pathchar*?filename){/*?{{{?*///根據目錄名和目錄下的文件名獲取文件路徑
int?len1=strlen(path);
int?len2=strlen(filename);
char*?str=(char*)malloc(len1+len2+2);
str[0]=‘\0‘;
str=strcat(strpath);
if(path[len1-1]!=‘/‘) str=strcat(str“/“);
str=strcat(strfilename);
return?str;
}/*?}}}?*/
void?printHelp(){//輸出幫助信息/*?{{{?*/
printf(“用法:find?路徑?-選項?正則表達式\n“);
printf(“選項說明:\n“);
printf(“-name?\“文件\“\n\t指定要查找的文件名\n“);
printf(“-prune?目錄\n\t指出搜索時不搜索該目錄\n“);
printf(“-mtime?+n或-n\n\t按時間查找\n“);
printf(“\t+n表示n天之前修改過的文件\n“);
printf(“\t-n表示n今天到n天之前修改過的文件\n“);
printf(“-ctime?+n或-n\n\t按時間查找\n“);
printf(“\t+n表示n天之前創建的文件\n“);
printf(“\t-n表示今天到n天前之間創建的文件\n“);
printf(“-print\n\t將搜索結果輸出到標準輸出\n“);
printf(“-exec?程序名\n\t對查
評論
共有 條評論