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;
}
}

运行结果:

最新文章

  1. MapReduce实现手机上网日志分析(分区)
  2. [c#]params可变参数
  3. BZOJ-2756 奇怪的游戏 黑白染色+最大流+当前弧优化+二分判断+分类讨论
  4. java的内省(introspector)
  5. matplotlib curve.py
  6. C#数据绑定中,时间为空时显示时间为原始日期问题
  7. Flask web开发 处理Ajax请求
  8. JavaBean-- 保存 范围
  9. 通过ajax前端后台交互/登录页和注册页前端后台交互详解/前端后台交互基础应用/几个后台函数的基础应用/php文件函数基础应用/php字符传函数基础应用/php数组函数基础应用
  10. C#注册表操作类--完整优化版
  11. (译)WebRTC实战: STUN, TURN, Signaling
  12. 如何对mRemoteNG在进行Linux终端访问时自定义配色
  13. python 实现统计ftp服务器指定目录下文件夹数目、文件数目及所有文件大小
  14. html5 canvas缩放变换
  15. python *args **kwargs,传入不固定的参数给函数,或者传入很多的内容给函数,常用在构造函数中。
  16. bat文件:启动,休眠VBox虚拟机
  17. struct、union、enum and sizeof
  18. django开发项目的部署nginx
  19. linux的定制和发布(二)
  20. CentOS 6.5 下MySql主从、主主配置

热门文章

  1. SpringCloud入门概述
  2. Centos6 No CMAKE_CXX_COMPILER could be found
  3. 深入学习OpenCV中图像灰度化原理,图像相似度的算法
  4. golang---常用函数
  5. 《Real World Haskell》内容脉络整理
  6. DP之背包
  7. java中的%取模
  8. 详解:Java字符串类型&quot;switch&quot;的底层原理
  9. Unity Ioc 依赖倒置及Untity AOP被动拦截/自动拦截
  10. Spring Boot2(八):性感banner,在线发牌