首页 > 系统相关 >linux开发之ls -l命令实现

linux开发之ls -l命令实现

时间:2023-04-17 18:34:55浏览次数:46  
标签:prime case st break 命令 mode linux include ls

效果

实现

大致思路

首先,程序需要通过参数接受一个文件名。接着通过stat函数获取文件的信息,通过处理,进行合适的输出。

转换时间戳可以用localtime函数来进行。

判断文件类型时候要按位与S_IFMT。判断权限时候,也要按位与对应的宏。

具体流程

  1. 判断程序用法是否正确
  2. 通过stas函数获取文件信息
  3. 将信息依次存到最终结果中

代码

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <string.h>
#include <pwd.h>
#include <grp.h>
#include <time.h>

int main(int argc, char *argv[]) {
    if(argc < 2) {
        printf("usage: %s filename\n", argv[0]);
        return -1;
    }

    // 获取文件信息
    struct stat st;
    int ret = stat(argv[1], &st);
    if(ret == -1) {
        perror(argv[1]);
        return -1;
    }

    // 记录文件类型以及权限
    char prime[11] = {0};
    // 文件类型
    switch(st.st_mode & S_IFMT) {
        case S_IFSOCK:
            prime[0] = 's';
            break;
        case S_IFLNK:
            prime[0] = 'l';
            break;
        case S_IFREG:
            prime[0] = '-';
            break;
        case S_IFBLK:
            prime[0] = 'b';
            break;
        case S_IFDIR:
            prime[0] = 'd';
            break;
        case S_IFCHR:
            prime[0] = 'c';
            break;
        case S_IFIFO:
            prime[0] = 'p';
            break;
        case S_IFMT:
            break;
        default:
            prime[0] = '?';
    }

    // 所有者权限
    prime[1] = st.st_mode & S_IRUSR ? 'r' : '-';
    prime[2] = st.st_mode & S_IWUSR ? 'w' : '-';
    prime[3] = st.st_mode & S_IXUSR ? 'x' : '-';
    // 所在组权限
    prime[4] = st.st_mode & S_IRGRP ? 'r' : '-';
    prime[5] = st.st_mode & S_IWGRP ? 'w' : '-';
    prime[6] = st.st_mode & S_IXGRP ? 'x' : '-';
    // 其他人权限
    prime[7] = st.st_mode & S_IROTH ? 'r' : '-';
    prime[8] = st.st_mode & S_IWOTH ? 'w' : '-';
    prime[9] = st.st_mode & S_IXOTH ? 'x' : '-';

    // 硬链接数量
    unsigned long int linknum = st.st_nlink;

    // 所有者
    char *file_user = getpwuid(st.st_uid)->pw_name;

    // 所在组
    char *file_group = getgrgid(st.st_gid)->gr_name;

    // 文件大小
    long int file_size = st.st_size;

    // 获取时间
    struct tm *time = localtime(&st.st_mtim.tv_sec);
    char time1[256] = {0};
    const char * months[12] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sepr", "Oct", "Nov", "Dec"};
    sprintf(time1, "%s %d %d:%d", months[time->tm_mon], time->tm_mday, time->tm_hour, time->tm_min);

    char buf[1024];
    sprintf(buf, "%s %lu %s %s %ld %s %s", prime, linknum, file_user, file_group, file_size, time1, argv[1]);
    puts(buf);

    return 0;
}

标签:prime,case,st,break,命令,mode,linux,include,ls
From: https://www.cnblogs.com/1v7w/p/17326310.html

相关文章

  • Linux常用命令大全
    Linux常用命令大全最近都在和Linux打交道,这方面基础比较薄弱的我只好买了本鸟哥的书看看,感觉还不错。我觉得Linux相比windows比较麻烦的就是很多东西都要用命令来控制,当然,这也是很多人喜欢linux的原因,比较短小但却功能强大。为了方便大家查找linux的相关命令,我就将我了解到的命令......
  • Docker基础命令及面试问题
    Docker包括三个基本概念:镜像(Image):Docker镜像(Image),就相当于是一个root文件系统。比如官方镜像ubuntu:16.04就包含了完整的一套Ubuntu16.04最小系统的root文件系统。容器(Container):镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定......
  • Redis中的Hash类型常用命令
    一、hset命令作用:设置hash类型值;格式:hsetkeyfieldvalue案例:192.168.0.111:0>hsetproductname苹果"1"192.168.0.111:0>hsetproductprice5"1"二、hget命令作用:获取hash类型某个key下的某个field的值格式:hgetkeyfield案例:192.168.0.111:0>hgetproductname"苹果&qu......
  • TAB命令补全及补全路径原理
    tab建可以实现命令及路径等补全,提高输入效率,避免出错命令补全:外部命令:bash根据PATH环境变量定义的路径,自左而右在每个路径搜寻以给定命令名命名的文件,第一次找到的命令即为要执行的命令。命令的子命令补全,需要安装bash-completion路径补全:把用户给出的字符串当做路径开头,并在其......
  • Git flow命令
    安装方法:brew install git-flow基本使用:初始化:gitflowinit本地新建feature:gitflowfeaturestartbranchname  (注意:生成的分支号会带feature)将本地featurePUSH到远程:gitflowfeaturepublishbranchname获取Publish的Feature:gitflowfeaturepulloriginbranchname完成......
  • Git和VIM常用命令速记
    查看主机名称:gitremoteshow手动建立追踪关系:gitbranch--set-upstreammasterorigin/next//指定master分支追踪origin/next分支重新绑定追踪关系:gitremoteremoveorigin//如果本地代码,已经关联了远程分支,则需要先解除关联[email protected]:......
  • linux系统升级
    3.8内核升级所有节点升级系统并重启(线上环境必须升级)yumupdate-y--exclude=kernel*wgethttp://193.49.22.109/elrepo/kernel/el7/x86_64/RPMS/kernel-ml-devel-4.19.12-1.el7.elrepo.x86_64.rpmwgethttp://193.49.22.109/elrepo/kernel/el7/x86_64/RPMS/kernel-ml-4.19.1......
  • Linux-文本编辑vim
    vim使用流程vim默认机器是不安装的,需要手动安装这个工具命令yuminstallvim-y #通过yum软件管理工具进行安装当vim打开不存在的文件的时候,默认会创建文件语法1.vim文件名2.输入字母i,进入编辑模式,代表insert输入字母o,在光标下一行开始编辑3.写完代码......
  • linux系统查找文件命令find,xargs
    FIND命令形式:findpathname-options[-print-exec-ok]pathname要查找的路径(.表示当前目录,/表示系统根目录)-print输出-exec 对匹配的文件执行该参数所给出的shell命令-execrm{}\;注意{}和\;之间的空格-ok以一种更为安全的模式来执行shell命令find命令有很多选项或表达式,每一......
  • 服务器为什么用Linux?其优势有哪些?
    Linux,全称GNU/Linux,是一套免费使用和自由传播的类Unix操作系统,拥有上百种不同的发行版本,同时也是服务器都会采用的操作系统。那么服务器为什么选择用Linux系统?本文为大家简单的解答一下。1、稳定性高业界公认:Linux服务器比Windows服务器稳定性高;多年使用经验,Linux稳......