if(sav(argv[i],&m)==0)
{
printf("Wrongorder!
\n");
return;
}
}
else
if(argv[i][1]=='-')
{
order[6]=1;
i=argc+1;
}
else
{
printf("Wrongorder!
\n");
return;
}
}
}
/*检查order*/
if(order[3]==1&&l==-1)
{
printf("Wrongorder!
\n");
return;
}
if(order[4]==1&&h==-1)
{
printf("Wrongorder!
\n");
return;
}
if(order[5]==1&&m==-1)
{
printf("Wrongorder!
\n");
return;
}
time(&tp);/*获取当前时间*/
ret=stat(path,&st);/*获取信息*/
/*处理order的信息*/
if(ret==0)/*成功读取path信息*/
{
if(S_ISDIR(st.st_mode))/*如果是dir*/
{
dir=opendir(path);
if(dir==NULL)/*Unreadable*/
{
printf("Opendirectory\"%s\":
%s(ERROR%d)\n",path,strerror(errno),errno);
return1;
}
while((entry=readdir(dir))!
=NULL)/*一直读,直至文件结束*/
{
strcpy(path1,path);
strcat(path1,"/");
strcat(path1,entry->d_name);
stat(path1,&st);
if(order[1]==0)/*不是-r*/
{
if(order[2]==1)/*-a*/
{
if(order[3]==1&&order[4]==1)/*-l和-h*/
{
if((st.st_size<=h)&&(st.st_size>=l))
if(order[5]==1){/*-m*/
if(((tp-st.st_mtime)/86400+1)<=m)
printf("%s\n",entry->d_name);}
else/*no-m*/
printf("%s\n",entry->d_name);
}
elseif(order[3]==1&&order[4]==0)
{
if(st.st_size>=l)
if(order[5]==1){
if(((tp-st.st_mtime)/86400+1)<=m)
printf("%s\n",entry->d_name);}
else
printf("%s\n",entry->d_name);
}
elseif(order[3]==0&&order[4]==1)
{
if(st.st_size<=m)
if(order[5]==1){
if(((tp-st.st_mtime)/86400+1)<=m)
printf("%s\n",entry->d_name);}
else
printf("%s\n",entry->d_name);
}
elseif(order[3]==0&&order[4]==0)
{
if(order[5]==1){
if(((tp-st.st_mtime)/86400+1)<=m)
printf("%s\n",entry->d_name);}
else
printf("%s\n",entry->d_name);
}
}
else
{
if(order[3]==1&&order[4]==1)
{
if((st.st_size<=h)&&(st.st_size>=l)&&entry->d_name[0]!
='.')
if(order[5]==1){
if(((tp-st.st_mtime)/86400+1)<=m)
printf("%s\n",entry->d_name);}
else
printf("%s\n",entry->d_name);
}
elseif(order[3]==1&&order[4]==0)
{
if(st.st_size>=l&&entry->d_name[0]!
='.')
if(order[5]==1){
if(((tp-st.st_mtime)/86400+1)<=m)
printf("%s\n",entry->d_name);}
else
printf("%s\n",entry->d_name);
}
elseif(order[3]==0&&order[4]==1)
{
if(st.st_size<=m&&entry->d_name[0]!
='.')
if(order[5]==1){
if(((tp-st.st_mtime)/86400+1)<=m)
printf("%s\n",entry->d_name);}
else
printf("%s\n",entry->d_name);
}
elseif(order[3]==0&&order[4]==0)
{
if(entry->d_name[0]!
='.')
if(order[5]==1){
if(((tp-st.st_mtime)/86400+1)<=m)
printf("%s\n",entry->d_name);}
else
printf("%s\n",entry->d_name);
}
}
}/*order[1]=0end*/
}/*while*/
closedir(dir);
}/*isDIR*/
else/*notadir*/
{
/*Changepathintofilename*/
for(i=0,j=0;path[i]!
='\0';i++)
if(path[i]=='/')
j++;
k=j;
for(j=0,i=0;jif(path[i]=='/')
j++;
k=i;
for(j=0;path[j+k]!
='\0';j++)
path[j]=path[j+k];
path[j]='\0';
/*Dealwiththeorders,notconsideringorder[1]-->-r*/
if(order[2]==1)
{
if(order[3]==1&&order[4]==1)
{
if((st.st_size<=h)&&(st.st_size>=l))
if(order[5]==1){
if(((tp-st.st_mtime)/86400+1)<=m)
printf("%s\n",path);}
else
printf("%s\n",path);
}
elseif(order[3]==1&&order[4]==0)
{
if(st.st_size>=l)
if(order[5]==1){
if(((tp-st.st_mtime)/86400+1)<=m)
printf("%s\n",path);}
else
printf("%s\n",path);
}
elseif(order[3]==0&&order[4]==1)
{
if(st.st_size<=m)
if(order[5]==1){
if(((tp-st.st_mtime)/86400+1)<=m)
printf("%s\n",path);}
else
printf("%s\n",path);
}
elseif(order[3]==0&&order[4]==0)
{
if(order[5]==1){
if(((tp-st.st_mtime)/86400+1)<=m)
printf("%s\n",path);}
else
printf("%s\n",path);
}
}
else
{
if(order[3]==1&&order[4]==1)
{
if((st.st_size<=h)&&(st.st_size>=l)&&path[0]!
='.')
if(order[5]==1){
if(((tp-st.st_mtime)/86400+1)<=m)
printf("%s\n",path);}
else
printf("%s\n",path);
}
elseif(order[3]==1&&order[4]==0)
{
if(st.st_size>=l&&path[0]!
='.')
if(order[5]==1){
if(((tp-st.st_mtime)/86400+1)<=m)
printf("%s\n",path);}
else
printf("%s\n",path);
}
elseif(order[3]==0&&order[4]==1)
{
if(st.st_size<=m&&path[0]!
='.')
if(order[5]==1){
if(((tp-st.st_mtime)/86400+1)<=m)
printf("%s\n",path);}
else
printf("%s\n",path);
}
elseif(order[3]==0&&order[4]==0)
{
if(path[0]!
='.')
if(order[5]==1){
if(((tp-st.st_mtime)/86400+1)<=m)
printf("%s\n",path);}
else
printf("%s\n",path);
}
}
}
}/*path正确*/
else
{
printf("Wrongpath.\n");
}/*path错误*/
return;
}/*main*/
四、测试结果
(1)./list–l100–h5000/bin/etc(列出大小在100~5000之间的文件)
。
。
。
由与上述/bin/etc下符合条件的文件太多,故只显示首尾部分结果。
(2)./list–ar-l50000–m2
(递归式列出当前目录树下文件大小超50KB并且2天内修改过的文件(包括文件名首字符为圆点的文件))
(3)./list---l
(4)./list*
五、实验总结
通过这次实验练习了在终端通过Vi编辑器编写代码,熟悉了命令模式和编辑模式的转换过程,学会了通过指令在终端直接编译、调试和运行代码。
在实现list函数功能的过程中遇到了很多问题,但通过对这些问题的研究和解决使我巩固了我对UNIX常用命令的功能的使用。
通过查找各种学习资料,更加深了我对Unix系统运行机制的理解,收获颇丰。