ls命令的简单实现
ls命令的简单实现
目标:简单的实现ls命令
实现的mic_ls命令主要功能
1.循环遍历目录
2.列出目标目录所有的子目录和文件
3.列出文件的文件权限,所有者,文件大小等详细信息
参数
-r 循环遍历
-a 列出全部文件
-l 列出详细信息(文件类型、权限。。。)
环境
ubuntu 14.04 gcc.real (Ubuntu 4.8.2-19ubuntu1) 4.8.2
代码
新手菜鸟 如有错误 欢迎指正
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<stdbool.h>
#include<dirent.h>
#include<string.h>
#include<sys/stat.h>
#include<pwd.h>
#include<grp.h>
bool show_all=false;
bool show_list=false;
bool show_recursion=false;
void do_ls_r(char *pathname,int depth);
void do_ls(char *pathname);
int judge_dir(char *pathname);
void do_showlist(DIR *dp);
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[])
{
int opt;
while((opt=getopt(argc,argv,"arl"))!=-1){
switch(opt){
case 'a':
show_all=true;
break;
case 'r':
show_recursion=true;
break;
case 'l':
show_list=true;
break;
case '?':
printf("unknow option :%c\n",optopt);
exit(1);
}
}
if(show_recursion){
if(argc==optind)
do_ls_r(".",4);
else{
for(;optind<argc;optind++){
if(judge_dir(argv[optind])){
printf("%s:\n",argv[optind]);
do_ls_r(argv[optind],4);
}
else{
printf("not a directory!\n");
exit(1);
}
}
}
}
else{
if(argc==optind)
do_ls(".");
else{
for(;optind<argc;optind++){
if(judge_dir(argv[optind])){
printf("%s:\n",argv[optind]);
do_ls(argv[optind]);
}
else{
printf("not a directory!\n");
exit(1);
}
}
}
}
}
int judge_dir(char *pathname)
{
struct stat statbuf;
if((lstat(pathname,&statbuf))<0){
printf("error in lstat!\n");
exit(1);
}
if(S_ISDIR(statbuf.st_mode))
return 1;
else
return -1;
}
void do_ls_r(char *pathname,int depth)
{
DIR *dp;
struct dirent *entry;
struct stat statbuf;
if((dp=opendir(pathname))==NULL){
printf("can't open dir:%s\n",pathname);
exit(1);
}
chdir(pathname);
while((entry=readdir(dp))!=NULL){
lstat(entry->d_name,&statbuf);
if(S_ISDIR(statbuf.st_mode)){
if(strcmp(".",entry->d_name)==0||strcmp("..",entry->d_name)==0)
continue;
printf("%*s%s/\n",depth," ",entry->d_name);
do_ls_r(entry->d_name,depth+4);
}
else
printf("%*s%s\n",depth," ",entry->d_name);
}
chdir("..");
closedir(dp);
}
void do_ls(char *pathname)
{
DIR *dp;
struct dirent *entry;
if((dp=opendir(pathname))==NULL){
printf("can't open dir:%s\n",pathname);
exit(1);
}
if(show_list){
chdir(pathname);
do_showlist(dp);
}
else{
while((entry=readdir(dp))!=NULL){
if(!show_all)
if(*(entry->d_name)=='.')
continue;
printf("%s\n",entry->d_name);
}
closedir(dp);
}
}
void do_showlist(DIR *dp)
{
struct dirent *entry;
struct stat statbuf;
char l_mode[11];
while((entry=readdir(dp))!=NULL){
if((lstat(entry->d_name,&statbuf))<0){
printf("error :in lstat\n");
exit(1);
}
if(!show_all)
if(*(entry->d_name)=='.')
continue;
mode_to_letters(statbuf.st_mode,l_mode);
printf("%s",l_mode);
printf("%4d ",(int)statbuf.st_nlink);
printf("%-8s ",uid_to_name(statbuf.st_uid));
printf("%-8s ",gid_to_name(statbuf.st_gid));
printf("%8ld ",(long)statbuf.st_size);
printf(" %s ",entry->d_name);
printf("\n");
}
}
void mode_to_letters(int mode,char str[])
{
strcpy(str,"----------");
if(S_ISDIR(mode)) str[0]='d';
if(S_ISCHR(mode)) str[0]='c';
if(S_ISBLK(mode)) str[0]='b';
if(mode&S_IRUSR) str[1]='r';
if(mode&S_IWUSR) str[2]='w';
if(mode&S_IXUSR) str[3]='x';
if(mode&S_IRGRP) str[4]='r';
if(mode&S_IWGRP) str[5]='w';
if(mode&S_IXGRP) str[6]='x';
if(mode&S_IROTH) str[7]='r';
if(mode&S_IWOTH) str[8]='w';
if(mode&S_IXOTH) str[9]='x';
}
char *uid_to_name(uid_t uid)
{
struct passwd *getpwuid(),*pw_ptr;
if((pw_ptr=getpwuid(uid))!=NULL)
return (pw_ptr->pw_name);
else
return NULL;
}
char *gid_to_name(gid_t gid)
{
struct group *getgrid,*grp_ptr;
if((grp_ptr=getgrgid(gid))!=NULL)
return (grp_ptr->gr_name);
else
return NULL;
}
ls命令的简单实现的更多相关文章
- Linux系统编程_1_文件夹读取(实现简单ls命令)
闲来无事.随便写写,实现简单的ls命令: | 1 #include <stdio.h> | 2 #include <stdlib.h> | 3 #include <dir ...
- Linux/UNIX编程:使用C语言实现简单的 ls 命令
刚好把 Linux/UNIX 编程中的文件和IO部分学完了,就想编写个 ls 命令练习一下,本以为很简单,调用个 stat 就完事了,没想到前前后后弄了七八个小时,90%的时间都用在格式化(像 ls ...
- Linux命令系列之ls——原来最简单的ls这么复杂
Linux命令系列之ls--原来最简单的ls这么复杂 ls命令应该是我们最常用的命令之一了,但是我们可能容易忽略那些看起来最简单的东西. 简介 ls命令的使用格式如下 ls [选项] [具体的文件] ...
- linux下的ls命令
在LINUX系统中有一个重要的概念:一切都是文件.其实这是UNIX哲学的一个体现,而Linux是重写UNIX而来,所以这个概念也就传承了下来.在UNIX系统中,把一切资源都看作是文件,包括硬件设备.U ...
- Linux下ls命令显示符号链接权限为777的探索
Linux下ls命令显示符号链接权限为777的探索 --深入ls.链接.文件系统与权限 一.摘要 ls是Linux和Unix下最常使用的命令之一,主要用来列举目录下的文件信息,-l参数允许查看当前目录 ...
- ls命令的20个实用范例
contents ls -l -h -lhS -l --block-size=M -a -d */ -g -G -n --color=never -i -p -r -R -t ls ~ ls --ve ...
- linux ls 命令
ls 命令是 Linux 下最常用的命令之一,用来查询目录下的内容(list directory contents).本文将介绍其基本的用法和一些典型的用例.笔者使用的测试环境为 ubuntu 16. ...
- shell的 ls命令
Linux下shell 的 ls 命令 ls -d 显示当前目录的上层目录,不显示子目录 ls -a 显示当前目录下的所有子目录,包括隐藏的文件 ls -l 显示当前目录下所有文件的所有信息(除隐藏文 ...
- Hadoop Ls命令添加显示条数限制參数
前言 在hadoop的FsShell命令中,预计非常多人比較经常使用的就是hadoop fs -ls,-lsr,-cat等等这种与Linux系统中差点儿一致的文件系统相关的命令.可是细致想想,这里还是 ...
随机推荐
- C#验证邮箱,电话,手机,数字,英文,日期,身份证,邮编,网址,IP类等常用函数封装
#region 验证邮箱验证邮箱 /**//// <summary> /// 验证邮箱 /// </summary> /// <param name="sour ...
- Android笔记(四十八) Android中的资源访问——SDCard
访问存储在SD卡中的文件 使用 Environment.getExternalStorageState(); 判断是否存在内存卡 使用 Environment.getExternalStorageDi ...
- curl-手册
Manual -- curl usage explained Related: Man Page FAQ LATEST VERSION You always find news about wha ...
- Maven简易笔记
Maven笔记 Maven笔记 Maven组成 安装配置 基本概念 Maven目录的典型结构 POM文件格式 GAV 依赖 依赖管理与父项目 关于父项目的一点主意事项 repository Maven ...
- 开发指南~小程序代码构成~JSON配置
2.1 JSON 配置 JSON 是一种数据格式,并不是编程语言,在小程序中,JSON扮演的静态配置的角色. 2.1.1 一个例子 先看一个例子,打开开发工具的编辑器,在根目录下可以找到 app.j ...
- 28.XSD(XML Schema Definition)用法实例介绍以及C#使用xsd文件验证XML格式
转自https://www.cnblogs.com/gdjlc/archive/2013/09/08/3308229.html XML Schema 语言也称作 XML Schema 定义(XML S ...
- used to do 与be used to doing /n.
1.used to do:表示过去的习惯性动作,过去如此,现在不再这样了.常译作“过去常常”.(过去时+动词不定式) He used to play basketball when he was yo ...
- Java - 框架之 SSH 整合
代码获取 十四. ssh 整合1 - 包 1. Struts jar 包 - Struts-2.xx\apps\stutrs2-blank\WEB-INF ...
- python - django (ORM使用步骤)
print('asd') """ # 1. 手动创建一个数据库 # 2. 在 Django 项目中设置连接数据库的相关配置(告诉Django 连接哪一个数据库) 在 DA ...
- Fzu-java1
Fzu-趣考网-java1 标签(空格分隔): java 序列 题目 代码 示例 思考 题目: -制作一个Java控制台程序,让他可以随机生成四则运算,并针对用户的输入判断对错.之后在Github新建 ...