Linux終端中ls -l是用來查看當前文件夾下所有文件的屬性
下面爲通過main函數的參數實現ls-l命令
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <dirent.h>
#include <sys/stat.h>
#include <time.h>
#include <pwd.h>
#include <grp.h>
void show_name(char* name,char* info)//給文件名字添加顏色
{
printf("%s",info);
if('d' == info[0])
{
printf("\33[1;34m %s\n\033[0m",name);
}
else if('x' == info[3])
{
printf("\33[1;32m %s\n\033[0m",name);
}
else
{
printf(" %s\n",name);
}
}
char* file_time(time_t t,char* str)//顯示時間
{
struct tm* it = localtime(&t);
sprintf(str,"%s %2d月 %02d %02d:%02d",str,it->tm_mon+1,it->tm_mday,it->tm_hour,it->tm_min);
return str;
}
char* id_to_user(uid_t uid,char* str)//顯示組名
{
struct passwd* pd = getpwuid(uid);
sprintf(str,"%s %s",str,pd->pw_name);
return str;
}
char* id_to_group(gid_t gid,char* str)//顯示用戶名
{
struct group* gp = getgrgid(gid);
sprintf(str,"%s %s",str,gp->gr_name);
return str;
}
char* dir_cnt(char* name,char* str)
{
int cnt = 1;
if('d' == str[0])
{
cnt = 0;
char arr[255] = {};
DIR* dp = opendir(name);
if(NULL == dp)
{
perror("opendir");
return str;
}
for(struct dirent* de=readdir(dp); NULL!=de;
de=readdir(dp))
{
if(DT_DIR==de->d_type) cnt++;
}
}
sprintf(str,"%s %d",str,cnt);
return str;
}
char* file_mode(mode_t m,char* str)//顯示文件屬性
{
if(S_ISREG(m))
str[0] = '-';
else if(S_ISDIR(m))
str[0] = 'd';
else if(S_ISCHR(m))
str[0] = 'c';
else if(S_ISBLK(m))
str[0] = 'b';
else if(S_ISFIFO(m))
str[0] = 'q';
else if(S_ISLNK(m))
str[0] = 'l';
else if(S_ISSOCK(m))
str[0] = 's';
else
str[0] = '?';
str[1] = '\0';
strcat(str,S_IRUSR&m?"r":"-");
strcat(str,S_IWUSR&m?"w":"-");
strcat(str,S_IXUSR&m?"x":"-");
strcat(str,S_IRGRP&m?"r":"-");
strcat(str,S_IWGRP&m?"w":"-");
strcat(str,S_IXGRP&m?"x":"-");
strcat(str,S_IROTH&m?"r":"-");
strcat(str,S_IWOTH&m?"w":"-");
strcat(str,S_IXOTH&m?"x":"-");
return str;
}
void list_file(const char* path)
{
DIR* dp = opendir(path);
if(NULL == dp)
{
perror("opendir");
return;
}
char info[80] = {};
for(struct dirent* de=readdir(dp); NULL!=de;
de=readdir(dp))
{
if('.' == de->d_name[0]) continue;
struct stat buf = {};
if(stat(de->d_name,&buf))
{
perror("stat");
return;
}
file_mode(buf.st_mode,info);
dir_cnt(de->d_name,info);
id_to_user(buf.st_uid,info);
id_to_group(buf.st_gid,info);
sprintf(info,"%s %5lu",info,buf.st_size);
file_time(buf.st_mtime,info);
show_name(de->d_name,info);
}
}
int main(int argc,char* argv[])
{
if(argc == 2)
{
if(0 == strcmp("-l",argv[1]))
list_file(".");
}
else if(argc == 3)
{
if(0 == strcmp("-l",argv[1]))
list_file(argv[2]);
}
else
{
printf("User:ls -l xxx\n");
}
}