linux 下动手实现bash -lR 命令
具体思路以后再补, 先给出代码:
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <dirent.h>
#include <iostream>
#include <string>
#include <cstring>
// 系统调用所用到的函数及说明:
DIR *opendir(const char *name);
// 通过路径打开一个目录,返回一个DIR结构体指针(目录流),失败返回NULL;
int chdir(const char *path);
// 改变目录,与用户通过cd命令改变目录一样,程序也可以通过chdir来改变目录,这样使得 fopen(),opendir(),这里需要路径的系统调用,可以使用相对于当前目录的相对路径打开文件(目录)。
int closedir(DIR*);
// 关闭目录流
struct dirent *readdir(DIR *);
// 读取目录中的下一个目录项,没有目录项可以读取时,返回为NULL;int fstat(int fildes,struct stat *buf);// 返回文件描述符相关的文件的状态信息
int stat(const char *path, struct stat *buf);// 通过文件名获取文件信息,并保存在buf所指的结构体stat中
int lstat(const char *path, struct stat *buf);// 如读取到了符号连接,lstat读取符号连接本身的状态信息,而stat读取的是符号连接指向文件的信息。void error_print(const char *ptr) /*errno错误处理*/
{perror(ptr);exit(EXIT_FAILURE);
}void mylist_dir(const char *pathname);
void list_message(const char *filename, const struct stat *get_message);
void file_type(const struct stat *get_message);
void timet_to_tm(const struct stat *get_message);
void file_power(const struct stat *get_message);
void file_power_char(mode_t mode, mode_t type, const char ch);
void file_type(const struct stat *get_message);// 递归目录
void mylist_dir(const char *pathname)
{using namespace std;cout << endl << "目录: " << pathname << endl << endl;DIR *ret_opendir = opendir(pathname); // 打开目录if (ret_opendir == NULL) error_print("opendir");int ret_chdir = chdir(pathname); /*先change dir到需要list的目录中, 这个像cd 进一个目录一样*/if (ret_chdir == -1) error_print("chdir");struct dirent *ret_readdir = NULL; /*定义接收readdir函数返回的结构体变量*/while (ret_readdir = readdir(ret_opendir)){ // 一直读到没有目录项为止char *filename = ret_readdir->d_name;struct stat get_message = {};int ret_stat = lstat(filename, &get_message); /*用lstat函数读取filenmae文件的信息,并将结果写到get_message结构体中*/if (ret_stat == -1) /*stat函数不出错则进行信息输出*/cout << "read stat error,file name: " << filename << endl;if (!(strcmp(filename, ".") && (strcmp(filename, "..") && filename[0] != '.')))continue;else if (S_ISDIR(get_message.st_mode)) /*判断是否是目录,是目录则进一步处理目录中个文件*/mylist_dir(filename);elselist_message(filename, &get_message);}chdir(".."); //返回到上级目录; 调式错误: 忘了写返回父目录closedir(ret_opendir);
}
// 打印文件类型
void file_type(const struct stat *get_message)
{mode_t mode = (*get_message).st_mode;if (S_ISREG(mode))std::cout << "-" ; /*普通文件*/else if (S_ISDIR(mode))std::cout << "d" ; /*目录文件*/
}
// 做权限打印的宏运算
void file_power_char(mode_t mode, mode_t type, const char ch)
{if ((mode & type) == type)printf("%c", ch);elseprintf("-");
}
// 打印权限
void file_power(const struct stat *get_message)
{mode_t mode = (*get_message).st_mode & 07777; /*取后四位*/file_power_char(mode, S_IRUSR, 'r'); /*判断user有无读权限*/file_power_char(mode, S_IWUSR, 'w'); /*判断user有无写权限*/file_power_char(mode, S_IXUSR, 'x'); /*判断user有无可执行权限*/file_power_char(mode, S_IRGRP, 'r'); /*判断group有无读权限*/file_power_char(mode, S_IWGRP, 'w'); /*判断group有无写权限*/file_power_char(mode, S_IXGRP, 'x'); /*判断group有无可执行权限*/file_power_char(mode, S_IROTH, 'r'); /*判断other有无读权限*/file_power_char(mode, S_IWOTH, 'w'); /*判断other有无写权限*/file_power_char(mode, S_IXOTH, 'x'); /*判断other有无可执行权限*/printf(" ");
}
// 打印时间
void timet_to_tm(const struct stat *get_message)
{struct tm *chtm = localtime(&(get_message->st_mtime));if (chtm == NULL){printf("localtime is error");exit(EXIT_FAILURE);}elseprintf("%4d月 %4d日 ", chtm->tm_mon + 1, chtm->tm_mday); /*tm_mon属于[0,11]*/if (chtm->tm_hour < 10) /*0~9的数要写成0X格式*/printf("0"); /*先打印0*/printf("%d:", chtm->tm_hour); /*再打印小时*/if (chtm->tm_min < 10)printf("0");printf("%d ", chtm->tm_min);
}
// 输出文件信息
void list_message(const char *filename, const struct stat *get_message) //处理文件信息
{using namespace std;file_type(get_message); // 打印文件类型file_power(get_message); // 判断并打印文件权限cout << get_message->st_nlink << "\t"; // 打印硬链接数cout << get_message->st_size << "\t"; // 打印所占空间文件大小timet_to_tm(get_message); // 将GMT时间的秒数转换成标准时间格式输出cout << filename << "\n"; // 输出文件名
}
int main(int argc, char **argv){using namespace std;if (argc != 3) {cout << "Too few parameter!" << endl;exit(EXIT_FAILURE);}if ((argc == 3) && !(strcmp(argv[1], "-lr"))){ /*判断是myls -lr argv[2]格式*/struct stat get_message = {};int ret_stat = stat(argv[2], &get_message);if (ret_stat == -1){cout << "stat failed" << endl;exit(EXIT_FAILURE);}if (S_ISDIR(get_message.st_mode)) /*判断是否是目录,是目录则进一步处理目录中个文件*/mylist_dir(argv[2]);else /*不是目录则直接处理普通文件*/list_message(argv[2], &get_message); /*文件stat信息输出函数*/}else{ /*不符合格式则结束进程*/cout << "error in main!" << endl;exit(EXIT_FAILURE);}return 0;
}
linux 下动手实现bash -lR 命令相关推荐
- Linux下常见的文本处理命令
众所周知,在Linux下"一切皆文件"的原则,一切配置文件都可以以文本的方式进行编辑.存储.故对文本文件的操作能力,决定着你是否能够在Linux下操纵自如.今天,就写下几个关于Li ...
- Linux下关于snmp的snmpwalk命令
最近需要在Linux下使用Snmp的snmpwalk命令读取一些设备信息,本机已安装SNMP但是在执行命令的时候却提示:"-bash: snmpwalk: command not found ...
- ssh远程执行命令 linux,Linux下使用SSH远程执行命令方法收集
说明:可以做SSH免密登录之后执行,这样可以省去每次执行输入密码的提示. 对于简单的命令: 如果是简单执行几个命令,则: ssh user@remoteNode "cd /home ; ls ...
- (转载)linux下的find文件查找命令与grep文件内容查找命令
linux下的find文件查找命令与grep文件内容查找命令 转载于和感谢:linux下的find文件查找命令与grep文件内容查找命令 目录 1.前言 1.1 find命令和grep命令的区别 2. ...
- linux下挂载和卸载的命令的用法:mount 、umount
linux下挂载和卸载的命令的用法:mount .umount 将Windows C:盘(hda1)安装在Linux文件系统的/winsys目录下, 命令是:mount /dev/had1 /wins ...
- linux为什么用tar压缩,linux下tar压缩和解压命令用法详解
linux下tar压缩和解压命令用法详解 2017-03-25 14:06 分享人:老牛 将/usr/local/test目录下所有文件仅打包,不压缩到 /usr/local/auto_bak/目下 ...
- linux如何在a休息时运行b,Linux下如何优雅地修正命令?
原标题:Linux下如何优雅地修正命令? 来源:公众号[编程珠玑] 作者:守望先生 ID:shouwangxiansheng 如何快速纠正你的linux命令?我们在输入命令的时候,难免会出现输入命令错 ...
- linux常用调试,linux下gdb常用的调试命令
用gdb调试程序时,常常很困惑一些命令的使用,要么是不知道这个命令,要么忘了命令的使用方法.接下来是小编为大家收集的linux下gdb常用的调试命令,希望能帮到大家. linux下gdb常用的调试命令 ...
- linux 更新软件命令 失败,对linux下软件(库)的更新命令详解
在ubuntu服务器下安装包的时候,经常会用到sudo apt-get install 包名 或 sudo pip install 包名,那么两者有什么区别呢? 1.区别 pip用来安装来自PyPI( ...
最新文章
- mysql plugin 调用_MySQL插件接口的调用方式
- 【白话机器学习】算法理论+实战之LightGBM算法
- jdk11默认使用的垃圾回收器是G1
- 让小程序在自有App中启动的技术来了:mPaaS小程序架构深度解析
- PHP的SPFA,由于是之前的c代码,风格你懂的........(夹带php队列实现)
- 大文件上传和在线播放
- java将json转为hashmap_将JSON字符串转换为HashMap
- 笨办法学R编程(1)
- php7 mcrypt模块_如何在php7.2/php7.3中安装mcrypt扩展?
- 京东数科科创板IPO获受理,刘强东为实际控制人
- linux读取 dev tty0,linux命令: ls命令
- 将gitee远程仓库抓取(克隆)到本地仓库
- ubuntu server 10.4下LAMP的安装
- 2020全国计算机专业考研学校
- 如何实现音频合成立体声录制?
- Illustrator 教程,如何在 Illustrator 中创建色板?
- 区块链 Gossip Protocol是什么
- 矩形碰撞公式,以前还做j2me时就用到的公式,为了方便查找,这里记一下
- [BZOJ3503][CQOI2014]和谐矩阵
- 细谈数据库表锁和行锁
热门文章
- 电脑硬盘主分区和逻辑分区的区别是什么
- [Kafka][错误: 找不到或无法加载主类 Files\Java\jdk1.8.0_101\lib\dt.jar;C:\Program]
- window10添加局域网计算机,Windows10系统创建局域网图文教程
- 发短视频是怎么赚钱的,如何剪辑原创短视频变现
- APP、PC客户端抓包、小程序\公众号
- SPSSPRO模型归纳整理
- Cuda相关的函数数
- python要什么电脑配置_学Python需要什么配置的电脑?
- 基础算法(一)零基础学算法---总结大篇
- win10系统关闭哪些服务器,win10.1系统哪些服务可以关闭掉?