ls命令用来显示目标列表。

常用参数:

-l    :以长格式显示目录下的内容列表。输出信息从左向右依次包括文件名,文件类型,权限模式,硬连接数,所有者、组、文件大小和文件的最后修改时间等;

-a   :显示所有档案及目录;

-r    :以文件名反序排列并输出目录内容列表;

-t    :用文件和目录的更改时间排序;

-R   :递归处理,将指定目录下的所有文件及子目录一并处理。

常用参数组合:

ls –rtl:反向按时间排序,查看一个目录下最近修改的文件。

ls –full-time:在写shell脚本的时候需要获取文件被更新的时间,此命令可以获取时间细微的变化。

获取指定目录下文件名:

/*
ls_name.c
*/
#include<stdio.h>
#include<sys/types.h>
#include<dirent.h> void do_ls(char[]); int main(int argc, char **argv)
{
if (argc == )
{
do_ls(".");
}
else
{
while(--argc)
{
printf("%s:\n",*++argv);
do_ls(*argv);
}
} return ;
} void do_ls(char dirname[])
{
DIR* dir_ptr;
struct dirent *direntp; if ((dir_ptr = opendir(dirname)) == NULL)
{
fprintf(stderr, "ls1: cannot open %s\n",dirname);
}
else
{
while((direntp = readdir(dir_ptr)) != NULL)
{
//printf("direntp->d_name = %s\n",direntp->d_name);
if( strcmp(direntp->d_name, ".") != &&
strcmp(direntp->d_name, "..") != )
printf("%s\n", direntp->d_name);
}
close(dir_ptr);
}
}

运行结果:

获取指定文件详细信息:

/*
ls_fileinfo.c
*/
#include<stdio.h>
#include<sys/types.h>
#include<sys/stat.h> void show_stat_info(char *filename, struct stat *buf)
{
printf("mode\t\t:%o\n", buf->st_mode);
printf("linkers\t\t:%d\n",(int)buf->st_nlink);
printf("user\t\t:%d\n", buf->st_uid);
printf("group_id\t:%d\n", buf->st_gid);
printf("size\t\t:%d\n", (int)buf->st_size);
printf("modtime\t\t:%d\n", (int)buf->st_mtime);
printf("group_name\t:%s\n", filename);
} int main(int argc, char **argv)
{
struct stat info; if (argc > )
{
if (stat(argv[], &info) != -)
{
show_stat_info(argv[], &info);
}
else
{
perror(argv[]);
}
} return ;
}

运行结果:

Linux下对于不同用户的权限展示,分别是用户、用户组、所在组在stat结构体中的mode这个字段进行存储。

mode字符是一个16位的二进制数,前4位用作文件类型,1代表具有某个属性,0代表没有。

接下来的三位分别为user-ID,set-group-ID和sticky位,最后9位是许可权限,分三组,每组3位。

这里使用掩码的技术来划分,就跟ip中的子网掩码一样把2进制的1000000110110110划分为1,000,000,110,110,110,从而得到8进制的100664

对二进制进行位与操作,就是所谓的解码。例如判断目录的代码如下:

if ((info.st_mode & ) == )
{
printf(“this is a directory”);
}

用宏定义代替以上代码:

#define S_ISFIFO(m)  (((m)&(0170000))==(0040000))
#define S_ISDIR(m) (((m)&(0170000))==(0020000))
#define S_ISCHR(m) (((m)&(0170000))==(0060000))
#define S_ISBLK(m) (((m)&(0170000))==(0100000))
if(S_ISDIR(info.st_mode))
{
printf("this is a directory");
}

获取指定目录下详细文件信息

/*
ls_fin.c
*/
#include<stdio.h>
#include<string.h>
#include<sys/types.h>
#include<dirent.h>
#include<sys/stat.h>
#include<grp.h>
#include<pwd.h> void do_ls(char []);
void dostat(char *);
void show_file_info(char *, struct stat *);
void mode_to_letters(int mode, char str[]);
char *uid_to_name(uid_t uid);
char *gid_to_name(gid_t gid); int main(int argc, char **argv)
{
if (argc == )
{
do_ls(".");
}
else
{
while (--argc)
{
printf("%s:\n", *++argv);
do_ls(*argv);
}
} return ;
} void do_ls(char dirname[])
{
DIR *dir_ptr;
struct dirent *direntp; if ((dir_ptr = opendir(dirname)) == NULL)
{
fprintf(stderr, "ls2: 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)
{
char *uid_to_name(), *ctime(), *gid_to_name();
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_IROTH) str[] = 'r';
if (mode & S_IWOTH) str[] = 'w';
if (mode & S_IXOTH) str[] = 'x';
} char *uid_to_name(uid_t uid)
{
struct passwd * getpwuid(), *pw_ptr;
static char numstr[]; if ((pw_ptr = getpwuid(uid)) == NULL)
{
sprintf(numstr, "%d", uid);
return numstr;
}
else
{
return pw_ptr->pw_name;
}
} 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;
}
}

运行结果:

C语言实现Linux之ls的更多相关文章

  1. Linux之ls命令

    s 命令可以说是linux下最常用的命令之一. -a 列出目录下的所有文件,包括以 . 开头的隐含文件.-b 把文件名中不可输出的字符用反斜杠加字符编号(就象在C语言里一样)的形式列出.-c 输出文件 ...

  2. Linux下ls命令显示符号链接权限为777的探索

    Linux下ls命令显示符号链接权限为777的探索 --深入ls.链接.文件系统与权限 一.摘要 ls是Linux和Unix下最常使用的命令之一,主要用来列举目录下的文件信息,-l参数允许查看当前目录 ...

  3. Linux命令 ls 和 ll 的使用方法与基本区别

    Linux 命令 ls 和 ll 的使用方法: ll:罗列出当前文件或目录的详细信息,含有时间.读写权限.大小.时间等信息 ,像Windows显示的详细信息.ll是“ls -l"的别名.相当 ...

  4. Linux中ls命令用法

    ls 命令的含义是list显示当前目录中的文件名字.注意不加参数它显示除隐藏文件外的所有文件及目录的名字. 1)ls –a 显示当前目录中的所有文件,包含隐藏文件 命令: aijian.shi@U-a ...

  5. linux中ls命令使用选项

    ls:英文全名:List即列表的意思 -a 列出目录下的所有文件,包括以 . 开头的隐含文件.-b 把文件名中不可输出的字符用反斜杠加字符编号(就象在C语言里一样)的形式列出.-c 输出文件的 i 节 ...

  6. Changing the Color of Linux ls Command 改变Linux的ls命令显示的颜色

    Linux command ls basically use the file /etc/DIR_COLORS or /etc/DIR_COLORS.xterm to define the color ...

  7. linux shell ls -1 列显示文件

    /******************************************************************************* * linux shell ls -1 ...

  8. C语言与linux的故事

    声明:本文是作者读完http://www.aqee.net/proof-that-linux-is-always-number-1/这篇文章后的随想. 凌晨2点,电脑前,程序员还在不断修改着自己的代码 ...

  9. Python argparse模块实现模拟 linux 的ls命令

    python 模拟linux的 ls 命令 sample: python custom_ls.py -alh c:/ 选项: -a ,--all 显示所有文件,包括'.'开头的隐藏文件 -l  列表显 ...

随机推荐

  1. Tomcat基础操作

    1.在WebApps ROOT目录里,如果删除过ROOT从新创建,放置index.html,index.jsp即可访问. 2.修改默认8080端口,打开server.xml,将8080端口修改为80即 ...

  2. 谈谈 Callable 任务是怎么运行的?它的执行结果又是怎么获取的?

    谈谈 Callable 任务是怎么运行的?它的执行结果又是怎么获取的? 向线程池提交Callable任务,会创建一个新线程(执行任务的线程)去执行这个Callable任务,但是通过Future#get ...

  3. table中td文字超出长度用省略号隐藏超出内容,鼠标点击内容全部显示

    1,设置css样式 <style>table {width: 100%;float: left;table-layout:fixed;width:600px;border:1px soli ...

  4. 一文读懂Java线程状态转换

    前言 本文描述Java线程线程状态及状态转换,不会涉及过多理论,主要以代码示例说明线程状态如何转换. 基础知识 1. 线程状态 Thread源码中的状态说明: 线程可以有6种状态: New(新建) R ...

  5. GIT篇章(一)

    git的使用 创建代码版本 cd进入到自己希望存储代码的目录路径,并创建本地仓库.git[pycharm直接打开终端就是项目根目录了.无须cd了] 新创建的本地仓库.git是个空仓库 cd 目录路径 ...

  6. 记录下vue 中引用echarts 出现 "TypeError: Cannot read property 'getAttribute' of undefined"问题

    今天做项目,用echarts展示数据 ,自己测试 先测试 了下.写的代码html: <div ref="myChart" style="height:300px;w ...

  7. 渗透技巧——导出Chrome浏览器中保存的密码

    0x00 前言 在后渗透阶段,获得权限后需要搜集目标系统的信息.信息越全面,越有助于进一步的渗透.对于Windows系统,用户浏览器往往包含有价值的信息. 在之前的文章<本地密码查看工具LaZa ...

  8. MYSQL的修改表结构SQL语句

    更多java学习资料>>> 1.背景 使用sql语句对表结构进行修改 2.案例演示 案例:表结构 CREATE TABLE `login_user` ( `id` ) NOT NUL ...

  9. CDH报错:ScmActive at bootup: Failed to validate the identity of Cloudera Manager.

    报错原因以及解决办法在官网: https://www.cloudera.com/documentation/enterprise/5-8-x/topics/cm_failover_db.html 1. ...

  10. SQOOP的使用方法

    Sqoop是个命令行工具,用来在Hadoop和rdbms之间传输数据. 以Hadoop的角度看待数据流向,从rdbms往Hadoop是导入用sqoop import命令,反之从hadoop往rdbms ...