LinuxC实战—ls命令实现(-R,-a,-l)

本文介绍了如何在Linux环境下实现ls命令的基础功能,包括处理带有尾部斜线的路径问题。作者遇到的问题是lstat()函数在处理带斜线的路径时失效,解决方案是避免直接操作。由于Windows文件访问限制,未能完全实现ls -R的全部功能。文章还探讨了Linux文件系统的inode和data block概念,解释了ls -l显示的目录大小与实际占用空间的关系。最后,提供了通过修改.bashrc文件来永久或临时添加命令到PATH的方法。
摘要由CSDN通过智能技术生成

实现ls命令基础功能:

主要问题:

一些玄学问题(改了好久

当使用lstat(path,&buf)函数时,如果path路径最后含有 / 符号(例home/),函数无法正常使用。

此处有问题,需要先用一个int数据接一下(图一strcat()下面一行,图二int xxx),不能直接操作。
在这里插入图片描述
在这里插入图片描述
因为电脑原因,无法完整实现ls -R类全部功能(某些Windows文件无法访问)

  1. 拓展知识
  2. 当我在写总用量的时候,在鸟哥里面,我知道了在linux文件系统中,与目录相关的权限和属性等信息是存放在inode中, 目录中的文件名都存放在最小存储单位data block中, 默认为4k也就是4096,但是实际上,并不是所有的文件都能占到4k,所以当目录中的文件容量少于4096时,用ls -l命令就会看到目录的大小是4096,. 当文件的数量大于4096小于8192时, 用ls -l命令就会看到目录的大小是8192, 以此类推。

linux系统中的单个文件的权限和属性等信息是存放在inode中的, 文件的内容是存放在data block中, 跟目录类似, 如果文件的内容大小不足4096个字节, 也会占用一个data block. 因此用ls -l命令查看文件的大小却不是4096的倍数。

所以这就牵扯出,你所看到的单个文件占用容量相加并不是他所占有的有效容量。在这里插入图片描述

// 代码
#include <sys/ioctl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <dirent.h>
#include <unistd.h>
#include <pwd.h>
#include <grp.h>
#include <errno.h>
#include <linux/limits.h>

#define PARAM_NONE 0
#define PARAM_A    1
#define PARAM_L    2
#define PARAM_R    4
#define MAXROWLEN  150

int g_leave_len = MAXROWLEN;                                                                                   
int g_maxlen;  //存放某目录下最长文件名的长度
int clour;  //底色
unsigned long long sum; 
void my_err(char error[],int num){
   

    fprintf(stderr,"line :%d",num);
    perror(error);
    exit(1);
}

void getclour(char name[]){
   
    struct stat buf;
    lstat(name,&buf);
    if(S_ISREG(buf.st_mode)){
   
        clour = 37;
        if((buf.st_mode&S_IXOTH)||(buf.st_mode&S_IXGRP)||(buf.st_mode&S_IXUSR)){
   
            clour = 32;
        }
    }
    else if(S_ISDIR(buf.st_mode)){
   
        clour = 34;
    }
    else if(S_ISCHR(buf.st_mode)){
   
        clour = 33;
    }
    else if(S_ISBLK(buf.st_mode)){
   
        clour = 33;
    }
    else if(S_ISFIFO(buf.st_mode)){
   
        clour = 35;
    }
    else if(S_ISLNK(buf.st_mode)){
   
        clour = 36;
    }
    else if(S_ISSOCK(buf.st_mode)){
   
        clour = 36;
    }

}
void display_attribute(struct stat buf,char * name)
{
   
    char buf_time[32];
    struct passwd *psd;
    struct group *grp;
    getclour(name);
    if(S_ISREG(buf.st_mode)){
   
        printf("-");
    }
    else if(S_ISDIR(buf.st_mode)){
   
        printf("d");
    }
    else if(S_ISCHR(buf.st_mode)){
   
        printf("c");
    }
    else if(S_ISBLK(buf.st_mode)){
   
        printf("b");
    }
    else if(S_ISFIFO(buf.st_mode)){
   
        printf("f");
    }
    else if(S_ISLNK(buf.st_mode)){
   
        printf("l");
    }
    else if(S_ISSOCK(buf.st_mode)){
   
        printf("s");
    }


    if(buf.st_mode & S_IRUSR){
    //用户的权限
        printf("r");
    }else
        printf(
  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Randy__Lambert

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值