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

实现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
  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Linux系统中,ls -l命令是用以列表的形式来查看当前目录下的文件或目录。所列出的信息包括文件或目录的权限、所有者、所属用户组、文件大小、创建时间等等。 在ls -l命令的输出中,文件或目录的大小是以字节为单位表示的。而文件夹的大小始终为4K字节(4096字节),不管文件夹中包含多少文件或大小不同的文件。这是因为在Linux系统中,文件夹也是一个文件,并且固定占用4K字节的磁盘空间。文件夹中存储了大量关于该文件夹的信息。 在ls -l命令输出中,还可以看到文件的权限信息。文件的权限由9个字符组成,分别表示文件所有者、所属用户组和其他用户对文件的读、写、执行权限。其中,r表示可读权限,w表示可写权限,x表示可执行权限。另外,有时候还会出现s和t的权限字符,s表示网络接口程序,t表示临时文件。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Linuxls -l命令展示信息详解](https://blog.csdn.net/qq_55754838/article/details/128379196)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [Linux ls -l 命令详解](https://blog.csdn.net/Black_Cat_33/article/details/120561163)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Randy__Lambert

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

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

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

打赏作者

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

抵扣说明:

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

余额充值