#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <dirent.h>
#include <sys/stat.h>
#include <grp.h>
#include <pwd.h>
#include <string.h>
void do_ls(char []);
/*将UID转化为用户名*/
char *uid_to_name(uid_t);
/*将GID转化为组名*/
char *gid_to_name(gid_t);
/*将mode转换成字符串*/
void mode_to_letters(int,char[]);
int main(int ac,char *av[]){
if(ac == 1)
do_ls(".");
else
while(--ac){
printf("%s:\n",*++av);
do_ls(*av);
}
}
void do_ls(char dirname[]){
DIR *dir_ptr;
struct dirent *direntp;
struct stat info;
if((dir_ptr = opendir(dirname))==NULL)
fprintf(stderr,"ls1:cannot open %s\n",dirname);
else{
while((direntp = readdir(dir_ptr))!=NULL){
char *sname = direntp->d_name;
if(stat(sname,&info)!=-1){
show_stat_info(sname,&info);
}else{
perror(sname);
}
//printf("%s\n",direntp->d_name);
}
closedir(dir_ptr);
}
}
/*显示文件的详细信息*/
show_stat_info(char *fname,struct stat *buf){
char str[10];
/* 显示文件的权限*/
int mode = buf->st_mode;
mode_to_letters(mode,str);
/*以八进制显示 type + mode */
printf("%s ",str);
/* 显示连接数 */
printf("%d ",buf->st_nlink);
/* 用户的ID*/
printf("%s ",uid_to_name(buf->st_uid));
/* 组ID*/
printf("%s ",gid_to_name(buf->st_gid));
/* 文件大小*/
printf("%5d ",buf->st_size);
/*文件的最后修改时间*/
printf("%.12s ",4+ctime(&buf->st_mtime));
/* 文件名*/
printf("%s\n",fname);
}
/* 将模式字段转换成字符*/
void mode_to_letters(int mode,char str[]){
/* 默认的权限值*/
strcpy(str,"----------");
/* 目录文件*/
if(S_ISDIR(mode))str[0]='d';
/* 字符设备文件*/
if(S_ISCHR(mode))str[0]='c';
/* 块设备文件*/
if(S_ISBLK(mode))str[0]='b';
/* 3 bits for user*/
if(mode&S_IRUSR)str[1]='r';
if(mode&S_IWUSR)str[2]='w';
if(mode&S_IXUSR)str[3]='x';
/* 3 bits for group*/
if(mode&S_IRGRP)str[4]='r';
if(mode&S_IWGRP)str[5]='w';
if(mode&S_IXGRP)str[6]='x';
/* 3 bit for other*/
if(mode&S_IROTH)str[7]='r';
if(mode&S_IWOTH)str[8]='w';
if(mode&S_IXOTH)str[9]='x';
}
/* 将用户ID转换为用户名*/
char *uid_to_name(uid_t uid){
//记录用户信息的数据结构passwd
struct passwd *pass;
static char numstr[10];
/* 记录用户的用户名char *pw_name
*
* 应该对那些uid对应的用户名为空的情况
* 应该输出的是uid
*
*/
if((pass = getpwuid(uid))==NULL){
sprintf(numstr,"%d",uid);
return numstr;
}else{
return pass->pw_name;
}
}
/* 将组ID转换为组名*/
char * gid_to_name(gid_t gid){
struct group *grp;
static char numstr[10];
if((grp = getgrgid(gid))==NULL){
sprintf(numstr,"%d",gid);
return numstr;
}else{
return grp->gr_name;
}
}
Shell命令编写——显示目录信息ls
最新推荐文章于 2022-03-22 11:30:14 发布