实现Linux下的ls -l命令
基本实现了Linux下的ls -l命令,对于不同的文件显示不同的颜色和显示符号链接暂时没有实现:
- /*************************************************************************
- > File Name: dirwalk.c
- > Author:
- > Mail:
- > Created Time: Tue 31 Mar 2015 11:56:38 AM CST
- ************************************************************************/
- #include<stdio.h>
- #include <sys/types.h>
- #include <sys/stat.h>
- #include <fcntl.h>
- #include <unistd.h>
- #include <stdlib.h>
- #include <string.h>
- #include <dirent.h>
- #include <time.h>
- #define MAX_PATH 1024
- #define MODE_LEN 10
- #define TIME_LEN 20
- #define NAME_LEN 30
- unsigned long ugo_mode[] = {S_IRUSR, S_IWUSR, S_IXUSR, S_IRGRP, S_IWGRP, S_IXGRP, S_IROTH, S_IWOTH, S_IXOTH};
- char* rwx[] = {"r", "w", "x"};
- char* userpath = "/etc/passwd";
- char* grouppath = "/etc/group";
- /*dirwalk: apply fcn to all files in dir */
- void dirwalk(char* dir, void(*fcn)(char*))
- {
- struct dirent *dp;
- DIR* dfd;
- char name[MAX_PATH];
- if((dfd = opendir(dir)) == NULL)
- {
- fprintf(stderr, "dirwalk: can't open %s\n", dir);
- return;
- }
- while((dp = readdir(dfd)) != NULL)
- {
- if(strcmp(dp->d_name, ".") == || strcmp(dp->d_name, "..") == )
- {
- continue;
- }
- if(strlen(dir) + strlen(dp->d_name) + > sizeof(name))
- {
- fprintf(stderr, "%s/%s too long\n", dir, dp->d_name);
- }else
- {
- sprintf(name, "%s/%s", dir, dp->d_name);
- (*fcn)(name);
- }
- }
- closedir(dfd);
- }
- /*getname: get the name of the user and the name of the group name */
- void getname(char* path, int id, char* name)
- {
- int fd, save_fd;
- if((fd = open(path, O_RDONLY)) < )
- {
- perror("open \n");
- exit();
- }
- save_fd = dup(STDIN_FILENO);
- dup2(fd, STDIN_FILENO);
- close(fd);
- char p[MAX_PATH];
- char usrid[];
- sprintf(usrid, "%d", id);
- char* puid;
- while((scanf("%s", p)) != EOF)
- {
- if((puid = strstr(p, usrid)) != NULL)
- {
- char* pFlag;
- char* pResult;
- if((pFlag = strstr(p, ":")) != NULL)
- {
- pResult = pFlag;
- pFlag = strstr(pFlag + , ":");
- }
- if(pFlag != NULL)
- {
- if((memcmp(pFlag + , puid, strlen(usrid))) == )
- {
- *pResult = '\0';
- strcpy(name, p);
- }
- }
- //printf("%s\n", puid);
- }
- }
- dup2(save_fd, STDIN_FILENO);
- close(save_fd);
- }
- /*getmode: get the mode of a file in string format by st_mode */
- void getmode(unsigned long st_mode, char* mode)
- {
- switch(st_mode & S_IFMT)
- {
- case S_IFDIR:
- mode[] = 'd';
- break;
- case S_IFIFO:
- mode[] = 'p';
- break;
- case S_IFBLK:
- mode[] = 'b';
- break;
- case S_IFCHR:
- mode[] = 'c';
- break;
- case S_IFREG:
- mode[] = '-';
- break;
- case S_IFLNK:
- mode[] = 'l';
- break;
- case S_IFSOCK:
- mode[] = 's';
- break;
- default:
- mode[] = 'u';
- break;
- }
- int i;
- for(i = ; i < ; ++i)
- {
- if(st_mode & ugo_mode[i])
- {
- strcat(mode, rwx[i % ]);
- }else
- {
- strcat(mode, "-");
- }
- }
- }
- /*gettime: get the time in string format */
- void gettime(const time_t ct, char* time)
- {
- char* tmp = ctime(&ct);
- time[] = tmp[];
- time[] = tmp[];
- time[] = tmp[];
- time[] = ' ';
- struct tm* tm_buf = gmtime(&ct);
- char last[];
- sprintf(last, "%02d %02d:%02d", tm_buf->tm_mday, tm_buf->tm_hour, tm_buf->tm_min);
- strcat(time, last);
- }
- /* print the file name and the size of the "name" */
- void fsize(char* name)
- {
- struct stat st_buf;
- if(stat(name, &st_buf) < )
- {
- fprintf(stderr, "fsize: can't access %s\n", name);
- return;
- }
- if((st_buf.st_mode & S_IFMT) == S_IFDIR)
- {
- dirwalk(name, fsize);
- }
- char* time = (char*)malloc(sizeof(char) * TIME_LEN);
- memset(time, , TIME_LEN);
- gettime(st_buf.st_atime, time);
- char* mode = (char*)malloc(sizeof(char) * MODE_LEN);
- memset(mode, , MODE_LEN);
- getmode(st_buf.st_mode, mode);
- char* username = (char*)malloc(sizeof(char) * NAME_LEN);
- memset(username, , NAME_LEN);
- getname(userpath, st_buf.st_uid, username);
- char* groupname = (char*)malloc(sizeof(char) * NAME_LEN);
- memset(groupname, , NAME_LEN);
- getname(grouppath, st_buf.st_gid, groupname);
- printf("%s %d %s %s %4ld %s %s\n", mode, (int)st_buf.st_nlink, username, groupname, st_buf.st_size, time, name);
- free(groupname);
- free(username);
- free(mode);
- free(time);
- }
- int main(int argc, char* argv[])
- {
- if(argc == )
- fsize(".");
- while(--argc)
- fsize(*++argv);
- return ;
实现Linux下的ls -l命令的更多相关文章
- 高仿linux下的ls -l命令——C语言实现
主要用到的函数可以参考头文件,仅仅支持ls -l这功能,扩展就交给大家了0.0 相关测试图片: 话不多说,直接上码 #include <stdio.h> #include < ...
- 模拟linux下的ls -l命令
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h&g ...
- 编程实现Linux下的ls -l
头文件 #ifndef __FUNC_H__ #define __FUNC_H__ #include <stdio.h> #include <stdlib.h> #includ ...
- linux下ls -l命令(即ll命令)查看文件的显示结果分析
在linux下使用“ls -l”或者“ls -al”或者“ll”命令查看文件及目录详情时,shell中会显示出好几列的信息.平时也没怎么注意过,今天忽然心血来潮想了解一下,于是整理了这篇博客,以供参考 ...
- linux下如何使用sftp命令【转】
linux下如何使用sftp命令 from: http://www.cnblogs.com/chen1987lei/archive/2010/11/26/1888391.html sftp 是一个 ...
- Linux下的一些常用命令(一)
在Linux环境下敲各种命令是再正常不过了,尤其是现在大多少服务器均为Linux系统,但是我又记不住这么多命令,只是偶尔在项目做完发布到服务器上的时候会涉及到,所以在网上找了一些命令,在此记录一下~ ...
- linux下find和grep命令详解
在linux下面工作,有些命令能够大大提高效率.本文就向大家介绍find.grep命令,他哥俩可以算是必会的linux命令,我几乎每天都要用到他们.本文结构如下: find命令 find命令的一般形式 ...
- 实现linux下的ls
实现linux下的ls ls的使用 ls -a 列出文件下所有的文件,包括以"."开头的隐藏文件(linux下文件隐藏文件是以.开头的,如果存在..代表存在着父目录). ls -l ...
- 在linux下的使用复制命令cp,不让出现“overwrite”(文件覆盖)提示的方法。(转)
在linux下的使用复制命令cp,不让出现“overwrite”(文件覆盖)提示的方法. 一般我们在使用cp命令时加上-f选项,希望不让出现“overwrite”的提示(文件覆盖的提示).如:# cp ...
随机推荐
- font-size:100%和font-size:0
h1,h2,h3,h4,h5,h6 {font-size:100%;} 正常情况下hx按照一定百分比增加字号,但是指定font-size:100%;就会继承body设置的字体大小 font-size: ...
- Linux 下常用命令
linux 下常用命令: 1.删除文件命令为 rm 2.创建目录的命令是:mkdir 3.删除目录的命令是rmdir(空目录) 4.切换到root帐号:su 5.查看所有进程:ps -aux 6.杀死 ...
- 使用ANT打包Android应用
大家好,今天来分享一下如何使用ANT打包Android应用. 通常我们习惯用eclipse来开发Android程序,它会自动帮我们打包当前的应用程序.如果在Navigator视图下,我们可以看到以下几 ...
- 使用Spring框架的12个开源项目
使用Spring框架的12个开源项目 http://www.csdn.net/article/2013-10-14/2817176-open-source-projects-that-use-spri ...
- zoj 3351 Bloodsucker(概率 dp)
题目:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=4530 dp[i]表示现在存在i个吸血鬼要达成目标(全为吸血鬼)天数的数学 ...
- urllib
urllib Python 标准库 urllib2 的使用细节 python 2.x 3.x from urllib import request with request.urlopen('http ...
- 解决iframe缓存
网上能搜到很多此类的资料,但都是互相转载,不太起作用.这几天写个用到,用了不少的iframe效果.结果发现iframe有缓存的问题.网上提供了思路,即对iframe的href后添加随即get值,来逃避 ...
- JAVA方法和本地方法(转载)
转载自:http://blog.sina.com.cn/s/blog_5b9b4abe01016zw0.html JAVA中有两种方法:JAVA方法和本地方法 JAVA方法是由JAVA编写的,编译 ...
- xmlns 属性
xmlns 属性 xmlns 属性可以在文档中定义一个或多个可供选择的命名空间.该属性可以放置在文档内任何元素的开始标签中.该属性的值类似于 URL,它定义了一个命名空间,浏览器会将此命名空间用于该属 ...
- oracle 有关大数据
一. oracle大数据量分区后查询效率低下的一些建议: 1 对于当前表tm_bus_realtime_log.查看它的索引,只有一个(索引名:INDEX_BUS_REALTIME 字段名:UPLOA ...