/*
1.尝试实现ls命令的功能 加选项-l -a -i -h
*/
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <errno.h>
#include <time.h>
#include <string.h>
#include <stdlib.h>
#include <dirent.h>
#include <pwd.h>
#include <grp.h> #define MAX 1024 static int myls_l(char *optarg);
static void ls_all(char *path);
static int myls_a(char *path);
static int is_dir(char *path);
static void myls_i(char *path);
static void myls_i_notdir(char *path);
static int myls_h(char *path); int main(int argc, char *argv[])
{
int c;
char *str = "-l:a:i:h:";
if (argc < )
return -; while () {
if ((c = getopt(argc, argv, str)) == -)
break;
switch (c) {
case 'l':
is_dir(optarg) ? ls_all(optarg) : myls_l(optarg);
break;
case 'a':
is_dir(optarg) ? myls_a(optarg) : puts(optarg);
break;
case 'i':
is_dir(optarg) ? myls_i(optarg) : myls_i_notdir(optarg);
break;
case 'h':
is_dir(optarg) ? myls_h(optarg) : puts(optarg);
break;
case '?':
printf("输入选项错误\n");
break;
case :
printf("错误参数选项%s\n", argv[optind-]);
break;
default:
break;
}
} return ;
} // 单文件显示详细信息 相当于ls -l +文件名
static int myls_l(char *optarg)
{
struct stat buf; if (stat(optarg, &buf) == -) {
perror("STAT()");
return -;
}
// 文件类型
if (S_ISREG(buf.st_mode))
putchar('-');
if (S_ISDIR(buf.st_mode))
putchar('d');
if (S_ISCHR(buf.st_mode))
putchar('c');
if (S_ISBLK(buf.st_mode))
putchar('b');
if (S_ISFIFO(buf.st_mode))
putchar('p');
if ((buf.st_mode & S_IFMT) == S_IFSOCK)
putchar('s');
if ((buf.st_mode & S_IFMT) == S_IFLNK)
putchar('l');
// 权限
if (buf.st_mode & S_IRUSR)
putchar('r');
else
putchar('-');
if (buf.st_mode & S_IWUSR)
putchar('w');
else
putchar('-');
if (buf.st_mode & S_IXUSR) {
if (buf.st_mode & S_ISUID) {
putchar('s');
} else {
putchar('x');
}
}
else
putchar('-');
if (buf.st_mode & S_IRGRP)
putchar('r');
else
putchar('-');
if (buf.st_mode & S_IWGRP)
putchar('w');
else
putchar('-');
if (buf.st_mode & S_IXGRP) {
if (buf.st_mode & S_ISGID) {
putchar('s');
} else {
putchar('x');
}
}
else
putchar('-');
if (buf.st_mode & S_IROTH)
putchar('r');
else
putchar('-');
if (buf.st_mode & S_IWOTH)
putchar('w');
else
putchar('-');
if (buf.st_mode & S_IXOTH) {
if (buf.st_mode & S_ISVTX) {
putchar('t');
} else {
putchar('x');
}
}
else
putchar('-');
// 硬链接
printf(" %zu ", buf.st_nlink);
// 拥有者
struct passwd *pwd = NULL;
pwd = getpwuid(buf.st_uid);
printf("%s ", pwd->pw_name);
// 所属组
struct group *grp = NULL;
grp = getgrgid(buf.st_gid);
printf("%s ", grp->gr_name);
// 文件字节大小
printf("%zu ", buf.st_size);
// 最后更改文件时间
struct tm *tmp = NULL;
char s[MAX] = {};
tmp = localtime(&(buf.st_mtim.tv_sec));
strftime(s, MAX, "%m月 %d %H:%M ", tmp);
printf("%s ", s);
// 文件名
char *ptr = NULL;
if ((ptr = strrchr(optarg, '/')) != NULL) {
printf("%s", ptr+);
} else {
printf("%s", optarg);
} putchar('\n'); return ;
} // 判断该文件名第一个字符是否为隐藏文件和 . .. .asd
static int is_hidden(char *str)
{
if (str[] == '.') {
return ; // 是隐藏文件返回1
}
return ;
} // 相当于 ls -l +目录的路径
static void ls_all(char *path)
{
DIR *dp = NULL;
char str[MAX] = {};
struct dirent *ret_dir = NULL;
dp = opendir(path); while () {
memset(str, '\0', MAX);
strcpy(str, path);
strcat(str, "/");
if ((ret_dir = readdir(dp)) != NULL) {
if (is_hidden(ret_dir->d_name)) //排除隐藏文件
continue;
strcat(str, ret_dir->d_name); //完整路径
myls_l(str); //调用函数
} else { // 目录读取完毕
break;
}
}
closedir(dp);
} // 判断是文件还是目录 是目录返回1 不是返回0
static int is_dir(char *path)
{
struct stat buf;
lstat(path, &buf);
if (!S_ISDIR(buf.st_mode)) {
return ;
} else
return ;
} // 相当于 ls -a +目录的路径 (当前目录下所以文件包含隐藏文件)
static int myls_a(char *path)
{
DIR *dp = NULL;
struct dirent *ptr = NULL; dp = opendir(path);
if (dp == NULL) {
perror("OPENDIR()");
return -;
}
while () {
ptr = readdir(dp); //返回值为结构体类型指针
if (ptr == NULL) {
if (errno) {
perror("READDIR()");
closedir(dp);
return -;
}
break;
}
printf("%s\n", ptr->d_name);
} closedir(dp);
return ;
} // 相当于 ls -i +目录 显示当前目录下所有文件的inode号 (不包含隐藏)
static void myls_i(char *path)
{
DIR *dp = NULL;
struct dirent *entry = NULL;
dp = opendir(path);
while () {
if ((entry = readdir(dp)) == NULL)
break;
if (is_hidden(entry->d_name)) { //隐藏文件
continue;
}
printf("%zu %s\n", entry->d_ino, entry->d_name);
}
} // 相当于 ls -i +文件
static void myls_i_notdir(char *path)
{
struct stat buf;
stat(path, &buf);
printf("%zu %s\n", buf.st_ino, path);
} // 相当于 ls -h +目录 本目录下所有文件(不包含隐藏)
static int myls_h(char *path)
{
DIR *dp = NULL;
struct dirent *ptr = NULL; dp = opendir(path);
if (dp == NULL) {
perror("OPENDIR()");
return -;
}
while () {
ptr = readdir(dp); //返回值为结构体类型指针
if (ptr == NULL) {
if (errno) {
perror("READDIR()");
closedir(dp);
return -;
}
break;
}
if (is_hidden(ptr->d_name)) {
continue;
}
printf("%s\n", ptr->d_name);
} closedir(dp);
return ;
}

2019.03.15王苛震——myls的更多相关文章

  1. 2019.03.15 ZJOI2019模拟赛 解题报告

    得分: \(20+45+15=80\)(三题暴力全写挂...) \(T1\):Lyk Love painting 首先,不难想到二分答案然后\(DP\)验证. 设当前需验证的答案为\(x\),则一个暴 ...

  2. 2019.03.03 - Linux搭建go语言交叉环境

    编译GO 1.6版本以上的需要依赖GO 1.4版本的二进制,并且需要把GOROOT_BOOTSTRAP的路径设置为1.4版本GO的根目录,这样它的bin目录就可以直接使用到1.4版本的GO 搭建go语 ...

  3. PSP(16/03/14-16/03/15)

    //整理了自己过去的时间记录文件,最早用电子版记录是15/04/21,依旧断断续续记录到15/11/21,每月至少三次记录,然而自己并没有对数据进行整理,只是纯粹记录,真是浪费了花在上面的时间.期间八 ...

  4. [2019.03.25]Linux中的查找

    TMUX天下第一 全世界所有用CLI Linux的人都应该用TMUX,我爱它! ======================== 以下是正文 ======================== Linu ...

  5. Data truncation: Incorrect datetime value: 'May 15, 2019 4:15:37 PM

    因为系统在windows下测试过是正常的 windows下的jdk+ windows下安装的mysql 全部cases通过 linux下的jdk + windows下安装的mysql 新增和更新,影响 ...

  6. MyBatis 配置/注解 SQL CRUD 经典解决方案(2019.08.15持续更新)

    本文旨在记录使用各位大神的经典解决方案. 2019.08.14 更新 Mybatis saveOrUpdate SelectKey非主键的使用 MyBatis实现SaveOrUpdate mybati ...

  7. 2019.03.14 ZJOI2019模拟赛 解题报告

    得分: \(100+100+0=200\)(\(T1\)在最后\(2\)分钟写了出来,\(T2\)在最后\(10\)分钟写了出来,反而\(T3\)写了\(4\)个小时爆\(0\)) \(T1\):风王 ...

  8. [2019.03.16]使用DOM操作函数和CSS选择器来针对已有的HTML进行只凭JS的改动

    刚入职的时候看到公司用的HTML日志生成工具附带的Panel,工具不够用,找个Fail还要找半天,于是自己琢磨着添砖加瓦.以前也是个半吊子前端工程师,现在可倒好,想要改页面却连页面生成的模板在哪里都不 ...

  9. 2019.03.25 bzoj4568: [Scoi2016]幸运数字(倍增+线性基)

    传送门 题意:给你一棵带点权的树,多次询问路径的最大异或和. 思路: 线性基上树?? 倍增维护一下就完了. 时间复杂度O(nlog3n)O(nlog^3n)O(nlog3n) 代码: #include ...

随机推荐

  1. 基于innodb_print_all_deadlocks从errorlog中解析MySQL死锁日志

    本文是说明如何获取死锁日志记录的,不是说明如何解决死锁问题的. MySQL的死锁可以通过show engine innodb status;来查看,但是show engine innodb statu ...

  2. 《Dare To Dream》第六次作业:团队项目系统设计改进与详细设计

    团队项目系统设计改进与详细设计 一.团队项目系统设计改进 任务1: a.分析项目系统设计说明书初稿的不足,特别是软件系统结构模型建模不完善内容.  初稿的不足:缺乏每个模块的具体业务流程详细设计和流程 ...

  3. 重写COMBOXEDIT

    一.需求 C#种的下拉框ComboBox不支持下拉复选框列表与下拉树形列表等,系统中需要用到的地方使用了第三方组件,现在需要将第三方组件替换掉. 二.设计 基本思路:重写ComboBox,将原生的下拉 ...

  4. Django2 SQLite3迁移到MySQL数据库

    https://blog.csdn.net/weixin_34257076/article/details/86843658

  5. vue在main.js中全局引用css的方法及坑

    步骤: 1.配置文件webpack.config.js: { test:/\.css$/, loader:'style-loader!css-loader' } 坑1:-loader尾缀 坑2:Mod ...

  6. 20175314 《Java程序设计》第九周学习总结

    20175314 <Java程序设计>第九周学习总结 教材学习内容总结 根据课本的介绍下载了MySQL和Navicat for MySQL并成功对后者进行破解 MySQL客户端管理工具(如 ...

  7. spring的事务操作(重点)

    这篇文章一起来回顾复习下spring的事务操作.事务是spring的重点, 也是面试的必问知识点之一. 说来这次面试期间,也问到了我,由于平时用到的比较少,也没有关注过这一块的东西,所以回答的不是特别 ...

  8. JAVA常用注解

    摘自:https://www.cnblogs.com/guobm/p/10611900.html 摘要:java引入注解后,编码节省了很多需要写代码的时间,而且精简了代码,本文主要罗列项目中常用注解. ...

  9. 7C - 折线分割平面

    我们看到过很多直线分割平面的题目,今天的这个题目稍微有些变化,我们要求的是n条折线分割平面的最大数目.比如,一条折线可以将平面分成两部分,两条折线最多可以将平面分成7部分,具体如下所示.  Input ...

  10. linux ssh反向代理

    参考:https://segmentfault.com/a/1190000002718360 内外运行:sshpass -p 123456 ssh -fNR 5000:localhost:22 ser ...