#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. Spring学习(三)—— 自动装配案例分析

    Spring_Autowiring collaborators 在Spring3.2.2中自动装配类型,分别为:no(default)(不采用自动装配).byName,byType,construct ...

  2. java — 垃圾回收

    1. 垃圾回收的意义 在java中,当没有对象指向原先分配给某个对象的内存的时候,这片内存就变成了垃圾,JVM的一个系统级线程就会自动释放这个内存块,垃圾回收意味着程序不再需要的对象是“无用的信息”, ...

  3. osg::Vec2 Vec3 Vec4

    osg::Vec2可以用于保存2D纹理坐标. osg::Vec3是一个三维浮点数数组. osg::Vec4用于保存颜色数据.

  4. 查看OpenWrt的RAM和FLASH

    加入了博客园,这是第一篇博文,不多写了,从以前博客搬东西过来吧. 买来一个OpenWrt的路由器,今天刚到的货,赶快拆开看看是不是替我换了RAM和FLASH的.那么怎么查看它是不是真的有那么大呢? 在 ...

  5. TScreen 类 - 通过 Screen 更换光标

    //更换窗体或某个控件的光标可以不通过 Screen 对象, 譬如: begin   Self.Cursor := crAppStart;   Panel1.Cursor := crHandPoint ...

  6. Qt Pro文件与Qt模块启用

    看qt论坛中经常有人忘记 QT+=network 等语句.随便写写吧,或许对他人有帮助. 一.从哪开始呢 不妨先看个例子吧: #include <QtCore/QCoreApplication& ...

  7. RT-thread内核之系统时钟

    一.系统时钟 rt-thread的系统时钟模块采用全局变量rt_tick作为系统时钟节拍,该变量在系统时钟中断函数中不断加1.而系统时钟中断源和中断间隔一般由MCU硬件定时器(如stm32的嘀嗒定时器 ...

  8. set类型没有单独取值功能 通过循环取值

    set类型没有单独取值功能 通过循环取值

  9. CMD命令提示符

    mspaint  画图板 notepad  打开记事本 write  写字板 calc.exe  计算器 control.exe  控制面板 osk  打开屏幕键盘 rononce -p ----15 ...

  10. Android Intent Action 一览表

    String ADD_SHORTCUT_ACTION 动作:在系统中添加一个快捷方式.. "android.intent.action.ADD_SHORTCUT" String A ...