#include <stdio.h>
#include <sys/types.h>
#include <dirent.h>
#include <sys/stat.h>
#include <string.h> void do_ls(char[]);
void dostat(char *);
void show_file_info( char *, struct stat *);
void mode_to_letters( int , char[] );
char * uid_to_name( uid_t );
char * gid_to_name( gid_t ); main(int ac, char *av[])
{
if( ac == )
do_ls( "." ); /*显示当前目录*/
else
while( --ac ){
printf("%s:\n", *++av); /*显示参数指定的目录*/
do_ls( *av );
}
} void do_ls( char dirname[] )
{
DIR *dir_ptr;
struct dirent *direntp; if( (dir_ptr = opendir( dirname )) == NULL) /*打开目录,成功则返回 DIR 结构指针*/
fprintf(stderr, "ls1: cannot open %s\n", dirname); else
{
while( ( direntp = readdir( dir_ptr ) ) != NULL )
dostat( direntp->d_name ); closedir( dir_ptr );
}
} void dostat( char *filename )
{
struct stat info; if( stat( filename, &info ) == - )
perror( filename );
else
show_file_info( filename, &info );
} void show_file_info( char *filename, struct stat *info_p )
{ if(filename[]!='.')
{
char *uid_to_name(), *ctime(), *gid_to_name(), *filemode();
void mode_to_letters(); char modestr[]; mode_to_letters( info_p->st_mode, modestr ); /*模式到字符的转换*/ printf("%s", modestr ); /*输出模式标识符*/ printf("%4d", (int)info_p->st_nlink); printf(" %-8s", uid_to_name(info_p->st_uid)); printf("%-8s", gid_to_name(info_p->st_gid)); printf("%8ld ", (long)info_p->st_size); printf("%.12s ", + ctime(&info_p->st_mtime)); printf("%s\n",filename);
} } void mode_to_letters( int mode, char str[] )
{
strcpy(str,"----------"); if( S_ISDIR(mode) ) str[] = 'd'; /*目录*/
if( S_ISCHR(mode) ) str[] = 'c'; /*字符文件*/
if( S_ISBLK(mode) ) str[] = 'b'; /*块文件*/ if(mode & S_IRUSR) str[] = 'r';
if(mode & S_IWUSR) str[] = 'w';
if(mode & S_IXUSR) str[] = 'x'; if(mode & S_IRGRP) str[] = 'r';
if(mode & S_IWGRP) str[] = 'w';
if(mode & S_IXGRP) str[] = 'x'; if(mode & S_IXOTH) str[] = 'r';
if(mode & S_IXOTH) str[] = 'w';
if(mode & S_IXOTH) str[] = 'x';
} #include <pwd.h> char *uid_to_name( uid_t uid )
/*
*返回和 uid 相应的用户名的指针
*/
{
struct passwd *getpwuid(), *pw_ptr;
static char numstr[]; if( ( pw_ptr = getpwuid( uid ) ) == NULL ) {
sprintf(numstr, "%d", uid); /*没有对应的用户名则 uid 存入 numstr,返回后以字符串的形式打印 uid*/
return numstr;
}
else
return pw_ptr->pw_name; /*打印用户名*/
} #include <grp.h> char *gid_to_name( gid_t gid )
{
struct group *getgrgid(), *grp_ptr;
static char numstr[]; if( ( grp_ptr = getgrgid(gid) ) == NULL ){ sprintf(numstr, "%d", gid);
return numstr;
}
else
return grp_ptr->gr_name;
}

linux 下用 c 实现 ls -l 命令的更多相关文章

  1. 实现Linux下的ls -l命令

    基本实现了Linux下的ls -l命令,对于不同的文件显示不同的颜色和显示符号链接暂时没有实现: /************************************************** ...

  2. linux 下文件重命名/移动/复制命令(转)

    linux 下文件重命名/移动/复制命令(转) linux下重命名文件:使用mv命令就可以了, 例:要把名为:abc   重命名为:123 可以这样操作: 重命名:MV命令 1.进入你的文件目录,运行 ...

  3. 构建LINUX下的入侵检测系统——LIDS 系统管理命令--vlock

    构建LINUX下的入侵检测系统——LIDS   系统管理命令--vlock http://blog.chinaunix.net/uid-306663-id-2440200.html LIDS官方网站: ...

  4. Linux下如何保持gnome-terminal窗口执行命令后停留而不立刻关闭(gnome-terminal -x)

    Linux下如何保持gnome-terminal窗口执行命令后停留而不立刻关闭(gnome-terminal -x) 转自:http://jakfruit.blog.163.com/blog/stat ...

  5. Linux下df与du两个命令的差别?

    Linux下df与du两个命令的差别? 一.df显示文件系统的使用情况,与du比較,就是更全盘化. 最经常使用的就是 df -T,显示文件系统的使用情况并显示文件系统的类型. 举比例如以下: [roo ...

  6. linux下使用script和scriptreplay对命令行操作进行录像

    转自:linux下用script和scriptreplay对命令行操作录像 在Linux中可以使用script命令来记录命令行的操作过程,并使用scriptreplay命令对命令操作进行回放,操作步骤 ...

  7. linux下查看动态链接库依赖关系的命令 x86: ldd *.so arm: arm-linux-readelf -d *.so 实际例子: 以项目中用到的库librtsp.so分析: lijun@ubuntu:~/workspace$ arm-hisiv100nptl-linux-ld -d librtsp.so arm-hisiv100nptl-linux-ld:

    linux下查看动态链接库依赖关系的命令 x86:ldd    *.so arm:arm-linux-readelf    -d    *.so 实际例子:以项目中用到的库librtsp.so分析:l ...

  8. Linux下mysql使用systemctl restart mysqld命令失败

    Linux下mysql使用systemctl restart mysqld命令失败: 解决方法:将mysql赋予root的权限 vim /etc/passwd 找到mysql开头的一行文件mysql: ...

  9. linux下ls -l命令(即ll命令)查看文件的显示结果分析

    在linux下使用“ls -l”或者“ls -al”或者“ll”命令查看文件及目录详情时,shell中会显示出好几列的信息.平时也没怎么注意过,今天忽然心血来潮想了解一下,于是整理了这篇博客,以供参考 ...

随机推荐

  1. python学习笔记03:python的核心数据类型

    从根本上讲,Python是一种面向对象的语言.它的类模块支持多态,操作符重载和多重继承等高级概念,并且以Python特有的简洁的语法和类型,OOP十分易于使用.Python的语法简单,容易上手. Py ...

  2. lol人物模型提取(五)

      修改了发过去后,那边说吊坠的绳子太细了,厚度至少1mm,推荐是2mm,需要我自己加粗,没办法又得用3ds max一根一根线地缩放了.   修改好后问报价,高精度树脂打印需要730元,还不带上色的, ...

  3. 如何彻底解决adb 5037端口被占用

    在进行安卓开发的时候是不是经常碰到adb端口被占用的情况? 解决这个问题的方法很简单,只需要设置一个系统环境变量就可以搞定. 设置方法: 增加系统环境变量变量名称:ADNROID_ADB_SERVER ...

  4. 从大量的IP访问记录中找到访问次数最多的IP

    1.内存不受限 一个IP有32bit(4Byte),1GB=10亿,那么在4GB内存的情况下,可以存10亿个IP.用HashMap,边存入IP边维护一个最大次数,这样遍历一遍就可以求出,时间复杂度为O ...

  5. 主流 Kubernetes 发行版梳理

    2014 年,Kubernetes 作为内部 Google orchestrator Borg 开源版本推出,目前已是最成功和发展最快的 IT 基础架构项目之一.2018 年,Kubernetes 已 ...

  6. Jira & SVN & Chrome extensions

    Jira & SVN & Chrome extensions Plugins SVN & Jira Plugins ok selector bug document.query ...

  7. 【.Net】Visual Studio的调试技巧

    这是我写的关于VS2010和.Net4发布的博客系列的第26篇. 今天的博文包含了一些有用的能用于VS的调试技巧. 我的朋友Scott Cate(他写了很多很好的关于VS使用技巧和窍门的博客)最近向我 ...

  8. 安装FastDFS+Nginx

    安装FastDFS FastDFS开发者的GitHub地址为:https://github.com/happyfish100 打开上述链接,我们点击fastdfs–>release,发现最新版的 ...

  9. 前端基础:HTML标签(下)

    前端基础HTML标签(下) 1.表单 表单的功能主要用于向服务器传输数据,从而实现客户端与Web服务器的交互.表单能够包含input系列标签,比如:文本字段.复选框.单选按钮.提交按钮等:表单还包含t ...

  10. echart模块化单文件引入

    echart模块化单文件引入百度上面是推荐这样使用.今天看了一下,做了个Demo. 文件结构如下: