C语言实现Linux之ls
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的更多相关文章
- Linux之ls命令
s 命令可以说是linux下最常用的命令之一. -a 列出目录下的所有文件,包括以 . 开头的隐含文件.-b 把文件名中不可输出的字符用反斜杠加字符编号(就象在C语言里一样)的形式列出.-c 输出文件 ...
- Linux下ls命令显示符号链接权限为777的探索
Linux下ls命令显示符号链接权限为777的探索 --深入ls.链接.文件系统与权限 一.摘要 ls是Linux和Unix下最常使用的命令之一,主要用来列举目录下的文件信息,-l参数允许查看当前目录 ...
- Linux命令 ls 和 ll 的使用方法与基本区别
Linux 命令 ls 和 ll 的使用方法: ll:罗列出当前文件或目录的详细信息,含有时间.读写权限.大小.时间等信息 ,像Windows显示的详细信息.ll是“ls -l"的别名.相当 ...
- Linux中ls命令用法
ls 命令的含义是list显示当前目录中的文件名字.注意不加参数它显示除隐藏文件外的所有文件及目录的名字. 1)ls –a 显示当前目录中的所有文件,包含隐藏文件 命令: aijian.shi@U-a ...
- linux中ls命令使用选项
ls:英文全名:List即列表的意思 -a 列出目录下的所有文件,包括以 . 开头的隐含文件.-b 把文件名中不可输出的字符用反斜杠加字符编号(就象在C语言里一样)的形式列出.-c 输出文件的 i 节 ...
- 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 ...
- linux shell ls -1 列显示文件
/******************************************************************************* * linux shell ls -1 ...
- C语言与linux的故事
声明:本文是作者读完http://www.aqee.net/proof-that-linux-is-always-number-1/这篇文章后的随想. 凌晨2点,电脑前,程序员还在不断修改着自己的代码 ...
- Python argparse模块实现模拟 linux 的ls命令
python 模拟linux的 ls 命令 sample: python custom_ls.py -alh c:/ 选项: -a ,--all 显示所有文件,包括'.'开头的隐藏文件 -l 列表显 ...
随机推荐
- main 函数返回值
[1]main函数 [2]main() 经典的C风格函数头,如下: main() 在C语言中,省略返回类型相当于说函数的类型为int. 但是,需要明确,C++逐步淘汰了这种用法. 另外,在C语言中,让 ...
- Mysql load data infile 命令导入含中文csv源数据文件 【错误代码 1300】
[1]Load data infile 命令导入含中文csv源数据文件 报错:Invalid utf8 character string: '??֧' (1)问题现象 csv格式文件源数据: 导入SQ ...
- 【UOJ#33】【UR #2】树上GCD(长链剖分,分块)
[UOJ#33][UR #2]树上GCD(长链剖分,分块) 题面 UOJ 题解 首先不求恰好,改为求\(i\)的倍数的个数,最后容斥一下就可以解决了. 那么我们考虑枚举一个\(LCA\)位置,在其两棵 ...
- react的标记渲染机制
// ReactUpdates.js - enqueueUpdate(component) function dirtyComponents.push(component); https://jue ...
- 详解Go变量类型的内存布局
定义 每当我们编写任何程序时,我们都需要在内存中存储一些数据/信息.数据存储在特定地址的存储器中.内存地址看起来像0xAFFFF(这是内存地址的十六进制表示). 现在,要访问数据,我们需要知道存储它的 ...
- Delphi - 利用DLL编程控制摄像头实现拍照、录制视频
Delphi利用avicap32.dll编程控制摄像头实现拍照.录制视频 项目需求:平板电脑(Windows系统)一维/二维码扫描功能: 需求分析: 需要扫描一维/二维码时,分两步实现. 第一步,av ...
- 关于final
最近见的一道选择题 刚学习一直认为final修饰,为常量,必须声明时被初始化,现在又明白第二种情况可以通过创建对象之后由构造方法立即初始化. 1.final修饰类不能被继承 2.final修饰方法不能 ...
- 在javascript中如何实现使小数保留两位精度而整数结果原样输出
Math.round(num*100)/100
- Gin-Go学习笔记四:Gin-Web框架 文件的上传下载
文件的上传和下载 1->文件的上传 文件的上传,采用的是uploadify.js这个插件. 本事例实现的是上传图片文件,其他的文件上传也一样. 2->文件的下载 文件的下载有两个实现的方式 ...
- SAP云平台和第三方CRM解决方案(火锅)互联
光看封面配图,这篇文章很容易被误认为在讲成都的美食之一:火锅. SAP成都研究院坐落在被联合国教科文组织授予过"美食之都"称号的成都,所在的天府软件园,半径1公里左右星罗棋布着很多 ...