具体思路以后再补, 先给出代码:

#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 命令相关推荐

  1. Linux下常见的文本处理命令

    众所周知,在Linux下"一切皆文件"的原则,一切配置文件都可以以文本的方式进行编辑.存储.故对文本文件的操作能力,决定着你是否能够在Linux下操纵自如.今天,就写下几个关于Li ...

  2. Linux下关于snmp的snmpwalk命令

    最近需要在Linux下使用Snmp的snmpwalk命令读取一些设备信息,本机已安装SNMP但是在执行命令的时候却提示:"-bash: snmpwalk: command not found ...

  3. ssh远程执行命令 linux,Linux下使用SSH远程执行命令方法收集

    说明:可以做SSH免密登录之后执行,这样可以省去每次执行输入密码的提示. 对于简单的命令: 如果是简单执行几个命令,则: ssh user@remoteNode "cd /home ; ls ...

  4. (转载)linux下的find文件查找命令与grep文件内容查找命令

    linux下的find文件查找命令与grep文件内容查找命令 转载于和感谢:linux下的find文件查找命令与grep文件内容查找命令 目录 1.前言 1.1 find命令和grep命令的区别 2. ...

  5. linux下挂载和卸载的命令的用法:mount 、umount

    linux下挂载和卸载的命令的用法:mount .umount 将Windows C:盘(hda1)安装在Linux文件系统的/winsys目录下, 命令是:mount /dev/had1 /wins ...

  6. linux为什么用tar压缩,linux下tar压缩和解压命令用法详解

    linux下tar压缩和解压命令用法详解 2017-03-25 14:06 分享人:老牛 将/usr/local/test目录下所有文件仅打包,不压缩到 /usr/local/auto_bak/目下 ...

  7. linux如何在a休息时运行b,Linux下如何优雅地修正命令?

    原标题:Linux下如何优雅地修正命令? 来源:公众号[编程珠玑] 作者:守望先生 ID:shouwangxiansheng 如何快速纠正你的linux命令?我们在输入命令的时候,难免会出现输入命令错 ...

  8. linux常用调试,linux下gdb常用的调试命令

    用gdb调试程序时,常常很困惑一些命令的使用,要么是不知道这个命令,要么忘了命令的使用方法.接下来是小编为大家收集的linux下gdb常用的调试命令,希望能帮到大家. linux下gdb常用的调试命令 ...

  9. linux 更新软件命令 失败,对linux下软件(库)的更新命令详解

    在ubuntu服务器下安装包的时候,经常会用到sudo apt-get install 包名 或 sudo pip install 包名,那么两者有什么区别呢? 1.区别 pip用来安装来自PyPI( ...

最新文章

  1. mysql plugin 调用_MySQL插件接口的调用方式
  2. 【白话机器学习】算法理论+实战之LightGBM算法
  3. jdk11默认使用的垃圾回收器是G1
  4. 让小程序在自有App中启动的技术来了:mPaaS小程序架构深度解析
  5. PHP的SPFA,由于是之前的c代码,风格你懂的........(夹带php队列实现)
  6. 大文件上传和在线播放
  7. java将json转为hashmap_将JSON字符串转换为HashMap
  8. 笨办法学R编程(1)
  9. php7 mcrypt模块_如何在php7.2/php7.3中安装mcrypt扩展?
  10. 京东数科科创板IPO获受理,刘强东为实际控制人
  11. linux读取 dev tty0,linux命令: ls命令
  12. 将gitee远程仓库抓取(克隆)到本地仓库
  13. ubuntu server 10.4下LAMP的安装
  14. 2020全国计算机专业考研学校
  15. 如何实现音频合成立体声录制?
  16. Illustrator 教程,如何在 Illustrator 中创建色板?
  17. 区块链 Gossip Protocol是什么
  18. 矩形碰撞公式,以前还做j2me时就用到的公式,为了方便查找,这里记一下
  19. [BZOJ3503][CQOI2014]和谐矩阵
  20. 细谈数据库表锁和行锁

热门文章

  1. 电脑硬盘主分区和逻辑分区的区别是什么
  2. [Kafka][错误: 找不到或无法加载主类 Files\Java\jdk1.8.0_101\lib\dt.jar;C:\Program]
  3. window10添加局域网计算机,Windows10系统创建局域网图文教程
  4. 发短视频是怎么赚钱的,如何剪辑原创短视频变现
  5. APP、PC客户端抓包、小程序\公众号
  6. SPSSPRO模型归纳整理
  7. Cuda相关的函数数
  8. python要什么电脑配置_学Python需要什么配置的电脑?
  9. 基础算法(一)零基础学算法---总结大篇
  10. win10系统关闭哪些服务器,win10.1系统哪些服务可以关闭掉?