当前位置: 首页 >> 资讯 > > 正文

全球热头条丨ls命令实现_linux模拟ls命令代码

2023-02-08 16:26:23来源:互联网

linux模拟ls命令代码代码如下:

/*

模拟限位开关(限位开关)命令,实现参数-塔里尔。有些代码重复出现,可改进


(资料图)

可以在该程序的基础上增加参数,该程序思路清晰,容易扩展

*/

#包括

#包括

#包括

#包括

#包括

#包括

#包括

#包括

#包括

#包括

#定义LL (10) /*带l参数标志*/

#定义白细胞介素11) /*带我参数标志*/

#定义RU (12) /*带稀有参数标志*/

#定义TL (116) /*带t参数标志*/

#定义铝(117) /*带a参数标志*/

#定义RL (118) /*带r参数标志*/

#定义长度500 /*字符串最大长度*/

#定义最大文件计数500/*文件列表最大长度*/

/*函数声明*/

void error(char* error_message,int line);

void display(struct stat* stalist,char (*namelist)[LENGTH],int n,int mode);

int file_list(char* path,struct stat* stalist,char (*namelist)[LENGTH],int mode);

void display _ simply(char(* name list)[LENGTH],int n);

void display _ LL(struct stat * stalist,char (*namelist)[LENGTH],int n);

void display _ IL(struct stat * stalist,char (*namelist)[LENGTH],int n);

void display _ LL _ IL(struct stat * stalist,char (*namelist)[LENGTH],int n);

void display _ RU(struct stat * stalist,char (*namelist)[LENGTH],int n,int mode);

void display _ RU _ LL(struct stat * stalist,char (*namelist)[LENGTH],int n,int mode);

void display _ RU _ IL(struct stat * stalist,char (*namelist)[LENGTH],int n,int mode);

void display _ RU _ IL _ LL(struct stat * stalist,char (*namelist)[LENGTH],int n,int mode);

/*主函数*/

int main(int argc,char **argv)

{

int i,j;

/*模式的前16个位用来标志那些能影响显示的参数,16位之后的位用来标志不影响输出格式的参数。这个程序只用到了0-3位,16-18位,如果要在该程序的基础上增加参数,可以用其他没有使用的位。

方式的第0位为一表示带l参数,模式的第一位为一表示带我参数,模式的第2位为一表示带稀有参数,模式的第16位为一表示带t参数,模式的第17位为一表示带a参数,模式的第18位为一表示带r参数*/

int mode=0;

char error _ message[LENGTH]={ 0 };/*错误信息*/

char path[LENGTH]={ 0 };/*路径*/

struct stat stalist[MAX _ FILE _ COUNT];/*文件详细信息数组*/

字符名称列表[MAX _ FILE _ COUNT][LENGTH];/*文件名数组*/

int flag=0;/*判断是否指定了目录*/

(同Internationalorganizations)国际组织计数;/*文件个数*/

/*解析参数*/

for(I=1;我

if(argv[i][0]=="-"){/*如果是选项参数*/

for(j=1;j

if(argv[i][j]=="l ")

模式=模式| LL

else if(argv[i][j]=="i ")

模式=模式| IL

else if(argv[i][j]=="R ")

模式=模式| RU

else if(argv[i][j]=="r ")

模式=模式| RL

else if(argv[i][j]=="a ")

模式=模式| AL

else if(argv[i][j]=="t ")

模式=模式| TL

否则{

snprintf(error_message,LENGTH," no option of %c ",argv[I][j]);

错误(错误消息,__行_ _);

}

}

}else{/*参数为目录或文件*/

if(flag==1)

错误("不能指定两个以上的目录或文件",_ _ LINE _ _);

其他

flag=1;

if(argv[i][0]!="/"){/*相对路径*/

strcat(path,get _ current _ dir _ name());

strcat(路径,"/");

strncat(path,argv[i],strlen(argv[I]);

}else/*绝对路径*/

strcpy(path,argv[I]);

}

}

if(flag==0)/*未指定任何目录或文件,则使用默认当前目录*/

strcat(path,get _ current _ dir _ name());

/*根据方式获取指定目录下的文件*/

count=file_list(path,stalist,namelist,mode);

/*根据方式显示文件*/

显示(列表、名称列表、计数、模式);

返回0;

}

/*获取文件列表*/

int file_list(char* path,struct stat* stalist,char (*namelist)[LENGTH],int mode)

{

int i=0,index,j,k;

目录*目录

结构方向* ptr

char str[LENGTH];

char name temp[LENGTH];

结构状态状态

if(stat(path,stalist[0])0){

//puts(路径);

错误("指定文件不存在,_ _ LINE _ _);

}

if(S_ISDIR(stalist[0]).st_mode)){/*如果该路径指向的是一个目录*/

if((dir=opendir(path))==NULL){/*打开目录*/

sprintf(str,无法打开“%s”,路径);

error(str,_ _ LINE _ _);

}

chdir(路径);/*改变当前工作目录到路径*/

I=0;

while((ptr=readdir(dir))!=NULL){/*依次读取目录下的所有文件*/

if(ptr-d_name[0]==" . "!(模式a1))/*忽略隐藏文件*/

继续;

/*按字母顺序插入到跟踪者数组及名字表数组*/

for(j=I;j0;j - ){

if(strcmp(ptr-d_name,namelist[j-1])0)

打破;

}

for(k=I;kj;k - ){

strcpy(名称列表[k],名称列表[k-1]);

stalist[k]=stalist[k-1];

}

strcpy(namelist[j],ptr-d _ name);

stat(ptr-d_name,stalist[j]);

我;

if(I==最大文件数)

错误("文件计数超出" MAX_FILE_COUNT ",_ _ LINE _ _);

}

closedir(dir);

}否则{

j=strlen(path)-1;

while(j=0 path[j]!="/"){

j-;

}

如果(j0)

错误("路径错误,_ _ LINE _ _);

j;

k=0;

while(path[j]){

名称列表[0][k]=路径[j];

j;

k;

}

名称列表[0][k]=0;

返回1;

}

如果(模式TL){/*按文件修改时间排序*/

for(j=0;j

index=j;

for(k=j ^ 1;k

if(stalist[index].圣彼得堡时间

index=k;

}

statemp=stalist[j];

stalist[j]=stalist[index];

stalist[index]=statemp;

strcpy(nametemp,name list[j]);

strcpy(名称列表[j],名称列表[索引]);

strcpy(namelist[index],name temp);

}

}

如果(模式RL){/*反序排列*/

for(j=0;j

strcpy(nametemp,name list[j]);

strcpy(名称列表[j],名称列表[I-j-1]);

strcpy(namelist[i-j-1],name temp);

statemp=stalist[j];

stalist[j]=stalist[I-j-1];

stalist[I-j-1]=statemp;

}

}

返回我;

}

/*根据方式选择不同的函数进行显示*/

void display(struct stat* stalist,char (*namelist)[LENGTH],int n,int mode)

{

/*使方式的高16位为0*/

int m=mode((116)-1);

开关(m){

案例0:

display_simply(namelist,n);

打破;

案例1:

display_LL(stalist,namelist,n);

打破;

案例二:

display_IL(stalist,namelist,n);

打破;

案例三:

display_LL_IL(stalist,namelist,n);

打破;

案例4:

display_RU(stalist,namelist,n,mode);

打破;

案例5:

display_RU_LL(stalist,namelist,n,mode);

打破;

案例6:

display_RU_IL(stalist,namelist,n,mode);

打破;

案例7:

display_RU_IL_LL(stalist,namelist,n,mode);

打破;

}

}

/*不带显示选项,简单显示文件名*/

void display _ simply(char(* name list)[LENGTH],int n)

{

int i,maxlength=0,cols

结构winsize ts

for(I=0;我

if(strlen(name list[I])maxlength)

maxlength=strlen(name list[I]);

/*获取终端的大小*/

ioctl(STDIN_FILENO,TIOCGWINSZ,ts);

cols=ts.ws _ col

cols/=(maxlength 1);

//lines=ts。ws _ row

for(I=0;我

如果(我!=0 i%cols==0)

puts(" ");

printf("%*s ",-(maxlength 1),name list[I]);

}

putchar(" \ n ");

}

/*-l参数,显示详细文件信息*/

void display _ LL(struct stat * stalist,char (*namelist)[LENGTH],int n)

{

int i,模式

字符*字符串

for(I=0;我

mode=stalist[i].st模式

if(S_ISDIR(mode))

printf(" d ");

其他

printf("-");

如果(模式(18))

printf(" r ");

其他

printf("-");

如果(模式(17))

printf(" w ");

其他

printf("-");

如果(模式(16))

printf(" x ");

其他

printf("-");

如果(模式(15))

printf(" r ");

其他

printf("-");

如果(模式(14))

printf(" w ");

其他

printf("-");

如果(模式(13))

printf(" x ");

其他

printf("-");

如果(模式(12))

printf(" r ");

其他

printf("-");

如果(模式(11))

printf(" w ");

其他

printf("-");

如果(模式(10))

printf(" x ");

其他

printf("-");

printf(“%-3d”),stalist[i].ST _ nlink);

printf(" %-6s ",getpwuid(stalist[i]).ST _ uid)-pw _ name);

printf(" %-6s ",getgrgid(stalist[i]).ST _ GID)-gr _ name);

printf(" %-10d ",stalist[i].ST _ size);

str=ctime(stalist[i]).ST _ mtime);

str[strlen(str)-2]=0;

printf(" %s ",str);

printf(" %s\n ",名称列表[i]).

}

}

/*-我参数,显示文件名及节点号*/

void display _ IL(struct stat * stalist,char (*namelist)[LENGTH],int n)

{

int i,maxlength=0,cols

结构winsize ts

for(I=0;我

if(strlen(name list[I])maxlength)

maxlength=strlen(name list[I]);

/*获取终端的大小*/

ioctl(STDIN_FILENO,TIOCGWINSZ,ts);

cols=ts.ws _ col

cols/=(maxlength 9);

//lines=ts。ws _ row

for(I=0;我

如果(我!=0 i%cols==0)

puts(" ");

printf(“%-8d”,stalist[i].ST _ ino);

printf("%*s ",-(maxlength 1),name list[I]);

}

putchar(" \ n ");

}

/*-李参数,显示详细文件信息和节点号*/

void display _ LL _ IL(struct stat * stalist,char (*namelist)[LENGTH],int n)

{

int i,模式

字符*字符串

for(I=0;我

printf(“%-8d”,stalist[i].ST _ ino);

mode=stalist[i].st模式

if(S_ISDIR(mode))

printf(" d ");

其他

printf("-");

如果(模式(18))

printf(" r ");

其他

printf("-");

如果(模式(17))

printf(" w ");

其他

printf("-");

如果(模式(16))

printf(" x ");

其他

printf("-");

如果(模式(15))

printf(" r ");

其他

printf("-");

如果(模式(14))

printf(" w ");

其他

printf("-");

如果(模式(13))

printf(" x ");

其他

printf("-");

如果(模式(12))

printf(" r ");

其他

printf("-");

如果(模式(11))

printf(" w ");

其他

printf("-");

如果(模式(10))

printf(" x ");

其他

printf("-");

printf(“%-3d”),stalist[i].ST _ nlink);

printf(" %-6s ",getpwuid(stalist[i]).ST _ uid)-pw _ name);

printf(" %-6s ",getgrgid(stalist[i]).ST _ GID)-gr _ name);

printf(" %-10d ",stalist[i].ST _ size);

str=ctime(stalist[i]).ST _ mtime);

str[strlen(str)-2]=0;

printf(" %s ",str);

printf(" %s\n ",名称列表[i]).

}

}

/*-R参数,简单显示所有文件,包括目录下面的子目录*/

void display _ RU(struct stat * stalist,char (*namelist)[LENGTH],int n,int mode)

{

int i,计数

char path[LENGTH]={0},temp[LENGTH]={0} .

struct stat sta[MAX _ FILE _ COUNT];

字符名称[最大文件数][长度];

puts(get _ current _ dir _ name());

display_simply(namelist,n);

putchar(" \ n ");

strcpy(path,get _ current _ dir _ name());

for(I=0;我

if(strcmp(namelist[i],".")==0 || strcmp(namelist[i],".")==0)

继续;

if(S_ISDIR(stalist[i]).st_mode)){

strcpy(temp,path);

strcat(路径,"/");

strcat(path,name list[I]);

count=文件列表(路径,sta,名称,模式);

display_RU(sta,name,count,mode);

strcpy(path,temp);

}

}

}

/*-Rl参数,显示所有文件,包括目录下面的子目录的详细信息*/

void display _ RU _ LL(struct stat * stalist,char (*namelist)[LENGTH],int n,int mode)

{

int i,计数

char path[LENGTH]={0},temp[LENGTH]={0} .

struct stat sta[MAX _ FILE _ COUNT];

字符名称[最大文件数][长度];

puts(get _ current _ dir _ name());

display_LL(stalist,namelist,n);

putchar(" \ n ");

strcpy(path,get _ current _ dir _ name());

for(I=0;我

if(strcmp(namelist[i],".")==0 || strcmp(namelist[i],".")==0)

继续;

if(S_ISDIR(stalist[i]).st_mode)){

strcpy(temp,path);

strcat(路径,"/");

strcat(path,name list[I]);

count=文件列表(路径,sta,名称,模式);

display_RU_LL(sta,name,count,mode);

strcpy(path,temp);

}

}

}

/*-Ri参数,简单显示所有文件,包括目录下的子目录,及节点号*/

void display _ RU _ IL(struct stat * stalist,char (*namelist)[LENGTH],int n,int mode)

{

int i,计数

char path[LENGTH]={0},temp[LENGTH]={0} .

struct stat sta[MAX _ FILE _ COUNT];

字符名称[最大文件数][长度];

puts(get _ current _ dir _ name());

display_IL(stalist,namelist,n);

putchar(" \ n ");

strcpy(path,get _ current _ dir _ name());

for(I=0;我

if(strcmp(namelist[i],".")==0 || strcmp(namelist[i],".")==0)

继续;

if(S_ISDIR(stalist[i]).st_mode)){

strcpy(temp,path);

strcat(路径,"/");

strcat(path,name list[I]);

count=文件列表(路径,sta,名称,模式);

display_RU_IL(sta,name,count,mode);

strcpy(path,temp);

}

}

}

/*-里尔参数,显示所有文件,包括目录下面的子目录的详细信息,及节点号*/

void display _ RU _ IL _ LL(struct stat * stalist,char (*namelist)[LENGTH],int n,int mode)

{

int i,计数

char path[LENGTH]={0},temp[LENGTH]={0} .

struct stat sta[MAX _ FILE _ COUNT];

字符名称[最大文件数][长度];

puts(get _ current _ dir _ name());

display_LL_IL(stalist,namelist,n);

putchar(" \ n ");

strcpy(path,get _ current _ dir _ name());

for(I=0;我

if(strcmp(namelist[i],".")==0 || strcmp(namelist[i],".")==0)

继续;

if(S_ISDIR(stalist[i]).st_mode)){

strcpy(temp,path);

strcat(路径,"/");

strcat(path,name list[I]);

count=文件列表(路径,sta,名称,模式);

display_RU_IL_LL(sta,name,count,mode);

strcpy(path,temp);

}

}

}

//错误处理函数

void error(char* error_message,int line)

{

char str[5];

sprintf(str," %d:",line);

strcat(str,error _ message);

佩罗尔(str);

退出(退出_失败);

}

看了"linux模拟ls命令代码"还想看:

1.ls命令怎么使用

2.Linux操作系统操作系统常用指令大全

3.解决文件传输协议(文件传输协议的缩写)的目录或限位开关(限位开关)命令无法查看文件列表的办法

4.怎么实现限位开关(限位开关)命令在win7下正常运行

本文到此结束,希望对大家有所帮助。

标签: 限位开关 所有文件 详细信息