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 列表显 ...
随机推荐
- 【leetcode-198】打家劫舍
你是一个专业的小偷,计划偷窃沿街的房屋.每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警. 给定一个代表每 ...
- 深入V8引擎-AST(6)
花了5篇才把一个字符串词法给解析完,不知道要多久才能刷完整个流程,GC.复杂数据类型的V8实现那些估计又是几十篇,天呐,真是给自己挖了个大坑. 前面几篇实际上只是执行了scanner.Initiali ...
- APUE—UNIX文件系统
在linux系统中——一切都是文件. 1. 磁盘物理结构 磁盘的物理结构如下: 磁盘由很多盘面组成,而盘面上则是由很多同心圆环组成的磁道,每个磁道又被切割成许多扇区.所有磁盘面的同一个磁道构成一个柱面 ...
- ASP.NET MVC+Easyui 后台管理系统的图片上传
实现图片的上传 easyui代码部分: //添加按钮 var URL; $("#btnCreate").click(function () { $('#UserDialog').d ...
- 在 VSCode 调试过程中,使用 Watcher,免手动重新编译
1.安装Microsoft.DotNet.Watcher.Tools包 dotnet add package Microsoft.DotNet.Watcher.Tools --version 2.0. ...
- 数据库-io检测工具sqldeveloper-18.2.0.183.1748-x64 下载链接
链接:https://pan.baidu.com/s/1R0ujc_9aXdc5O5i1nhNAlA 提取码:o6is
- 1 js中常用的操作
总结一些前端js常用的操作 常用日期操作:前端开发常用 JS 方法 js中array.list.map的遍历:js遍历集合(Array,Map,Set) js中对象的定义:js创建自定义对象的几种方式 ...
- MySQL中的存储过程、游标和存储函数
MySQL中的存储过程首先来看两个问题: 1.什么是存储过程? 存储过程(Stored Procedure)是在数据库系统中,一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存 ...
- CSP复赛day2模拟题
没错,我又爆零了.....先让我自闭一分钟.....so 当你忘记努力的时候,现实会用一记响亮的耳光告诉你东西南北在哪. 好了,现在重归正题: 全国信息学奥林匹克联赛(NOIP2014) 复赛模拟题 ...
- MAC电脑卸载Jenkins
终端输入下面命令 '/Library/Application Support/Jenkins/Uninstall.command' zudeMoPro:~ zhu$ '/Library/Applica ...