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. Docker修改已创建容器端口映射

    修改已创建容器端口映射. 通过编辑 hostconfig.json 文件来修改 Docker 容器的端口映射 该文件地址:/var/lib/docker/containers/[hash_of_the ...

  2. MediaWiki上传文件大小设置

    一.概述 MediaWiki默认最大上传文件大小为2M,碰到文件较大需要修改这个限制,需要改为8M. 二.修改php.ini 使用docker运行的MediaWiki,默认是没有php.ini这个文件 ...

  3. Django---CSRF的装饰器,CSRF的流程,JSON数据格式,ajax技术(基于JQ实现)

    Django---CSRF的装饰器,CSRF的流程,JSON数据格式,ajax技术(基于JQ实现) 一丶CSRF相关的装饰器 from django.utils.decorators import m ...

  4. js点击按钮button效果(波效果)

    Material Design风格纯js按钮点击波特效 演示效果 html部分: <button data-ripple> Demo button 6 </button> cs ...

  5. Vue+element 修改样式的scoped穿透方法

    我们在修改element的一些样式的时候,在加了scoped的时候会不起作用,下面是解决方案: 解决方法:起一个类名将页面包裹起来,后面加 /deep/ <style scoped> 1 ...

  6. NPOI.dll 在哪里?

    一.问题 NPOI下载后找不到网上人家说的几个DLL https://bbs.csdn.net/topics/392510552 二.答案: 1.VS2015引用NPOI2.4.1和NuGet的安装方 ...

  7. c#执行sql超时

    超时分为多种,SqlConnection有超时选项, SqlDataAdapter也有超时选项设置如下: SqlConnection:就用链接字符串给予的Timeout设置就行单位秒: SqlData ...

  8. 使用Deployment控制器创建Pods并使Service发布到外网可访问

    由于NFS支持节点共同读取及写入,所以可使用Deployment控制器创建多个Pod,并且每一个Pod都共享同一个目录 k8s-master kubnet@hadoop2 volumes]$ vim ...

  9. 第一部分day1-变量、运算

    变量:为了存储程序运算过程中的一些中间 结果,为了方便日后调用常量:固定不变的量,字符大写 变量的命名规则 1.字母数字下划线组成2.不能以数字开头,不能含特殊字符和空格3.不能以保留字命名4.不能以 ...

  10. 用session实现的用户登陆,客户端是怎样获取到cookie信息的

    大家都知道cookie是存在客户端,session存在服务器端.那么客户端具体是怎样获取cookie信息的呢? 更好的阅读体验可访问 这里. 实验环境 实验环境:xampp + Thinkphp5 + ...