ls -l 文件/目录

限时加码!20+主流AI编程工具免费用 购周边加赠Coding Plan Lite,Claude Code、Cursor等即刻畅享,学习进阶更高效! 阅读详情
/** @file      my_ls.c 
 *  @brief     实现ls -l []这个功能
 *  @note      通过这个函数能够获取文件的信息并在终端显示
 *  @author    
 *  @date      
 *  @version   v1.0
 */

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

#define FILELENGTH 50   // 文件长度
#define N_BITS     3    // 用于打印文件权限时使用

/** @Fn     int isDir(const char *name)
 *  @brief  判断该文件是否是目录
 *  @param  const char *name  文件名
 *  @return 0 - true -1 - false
 */
int isDir(const char *name)
{
    struct stat buf;
    if ( stat(name, &buf) != 0 )
    {
        printf("stat %s error! \n", name);
        exit (-1);
    }
    switch ( buf.st_mode & S_IFMT)
    {
        case S_IFDIR:
            return 0;
            break;
        default:
            return -1;
            break;
    }
}

/** @Fn     void print_perm(mode_t st_mode)
 *  @brief  打印文件类型和文件的读写权限 rwxrwx...
 *  @note   由于st_mode是总共由9位组成,先必须循环3次分别对应自己的权限,
    本组权限,再之后是其他人权限,因此必须循环三次,每次循环之后
    mask右移三位进入下一组的权限打印
    通过配对这三位的值,将数组perm[]对应的值打印出来
 *  @param  mode_t st_mode  传入的文件权限值
 *  @return none
 */

void print_perm(mode_t st_mode)
{
    int i, tmp;
    unsigned int mask = 0700;       
    static char *perm[]={"---", "--x", "-w-", "-wx",
                         "r--", "r-x", "rw-", "rwx"};

    if ( (st_mode & S_IFMT) == S_IFSOCK )    // socket文件
    {
        printf("s");
    }
    else if ( (st_mode & S_IFMT) == S_IFLNK )     // 链接文件
    {
        printf("I");
    }
    else if ( (st_mode & S_IFMT) == S_IFREG )     // 普通文件
    {
        printf("-");
    }
    else if ( (st_mode & S_IFMT) == S_IFBLK )     // 块文件
    {
        printf("b");
    }
    else if ( (st_mode & S_IFMT) == S_IFCHR )     // 字符文件
    {
        printf("c");
    }
    else if ( (st_mode & S_IFMT) == S_IFIFO )     // FIFO
    {
        printf("p");
    }
    else
    {
        printf("d");
    }
    
    
    for ( i=3; i>0 ; --i )
    {
        tmp = (st_mode & mask) >> (i - 1)*N_BITS;
        printf("%3s", perm[tmp]);
        mask >>= N_BITS;
    }

}

/*
void print_perm(mode_t st_mode)
{
    printf("Now here!\n");
    char str[11];    strcpy( str, "----------" );    
    //if ( S_ISDIR(mode) )  str[0] = 'd';    
    //if ( S_ISCHR(mode) )  str[0] = 'c';    
    //if ( S_ISBLK(mode) )  str[0] = 'b';    
    if ( st_mode & S_IRUSR ) str[1] = 'r';    
    if ( st_mode & S_IWUSR ) str[2] = 'w';    
    if ( st_mode & S_IXUSR ) str[3] = 'x';    
    if ( st_mode & S_IRGRP ) str[4] = 'r';    
    if ( st_mode & S_IWGRP ) str[5] = 'w';    
    if ( st_mode & S_IXGRP ) str[6] = 'x';    
    if ( st_mode & S_IROTH ) str[7] = 'r';    
    if ( st_mode & S_IWOTH ) str[8] = 'w';    
    if ( st_mode & S_IXOTH ) str[9] = 'x';    
    printf("%s ",str);
}
*/

/** @Fn     void file_info(const char *file)
 *  @brief  通过stat函数打印file的信息
 *  @param  const char *file  文件名
 *  @return 
 */
void file_info(const char *file)
{
    struct stat buf;
    if ( stat(file, &buf) != 0 )
    {
        printf("stat %s error! \n", file);
        exit (-1);
    }

    struct passwd *p_passwd;
    struct group *p_group;
    int i;
    char *p_time;

    p_time = ctime(&(buf.st_mtime));    // 获取文件时间
    p_passwd = getpwuid(buf.st_uid);    // get password file entry
    p_group = getgrgid(buf.st_gid);     // get grop file entry
    
    print_perm(buf.st_mode);
    printf(" %6d %s %s %12d ", buf.st_ino, p_passwd->pw_name, p_group->gr_name, buf.st_size);
    
    for ( i=0; (p_time[i] != 0) && (p_time[i] != '\n'); i++ )  // 打印时间
    {
        putchar(p_time[i]);
    }
    printf(" %s\n", file);

}


/** @Fn     void dir_info(const char *file)
 *  @brief  通过dir相关函数打印目录下面的信息
 *  @param  const char *file  文件名
 *  @return 
 */
void dir_info(const char *file)
{
    DIR *dirp;
    struct dirent *dp;
    struct stat buf;

    dirp = opendir(file);
    if ( NULL == dirp )
    {
        printf("open dir %s error!\n", file);
        exit (-1);
    }
    chdir(file);

    while ( (dp = readdir(dirp)) != NULL )
    {
        if ( (0 == strcmp(dp->d_name, "."))|| (0 == strcmp(dp->d_name, "..")))
        {
            continue;
        }
        file_info(dp->d_name);
    }
    
}



/** @Fn     void show_file(const char *file)
 *  @brief  通过stat函数打印file的信息
 *  @param  const char *file  文件名
 *  @return 
 */
void show_file(const char *file) 
{
    struct stat buf;
    
    if ( 0 == isDir(file) )             // 如果该文件是目录
    {
        printf("%s is a dir!\n", file); 
        dir_info(file);                 // 调用dir_info()显示信息
    }
    else
    {
        file_info(file);                // 调用file_info()显示信息
    }                       
}


/** @Fn     int main(int argc, char *argv[]) 
 *  @brief  函数入口
 *  @param  none
 *  @return 0 - true   1 - false
 */
int main(int argc, char *argv[])
{
    if ( argc != 3 )
    {
        printf("Input format error!\n");
        printf("<Usage> : ls -l file\n");
        exit (1);
    }
    
    if ( strcmp(argv[1], "-l") != 0 )
    {
        printf("Input format error!\n");
        printf("param is: -l\n");
        exit (1);
    }

    if ( access(argv[2], F_OK) != 0 )       // 判断文件是否存在
    {
        printf("file not exitst!\n");
        exit(-1);
    }

    show_file(argv[2]);

    return 0;
}






c/c++实现linux系统中ls,ls -l命令 linux环境c/c++实现ls,ls -l 仿写ls -l的功能(编写myls程序) ,参数通过命令行传入: 1、获取当前工作目录路径并对该目录实现遍历 2、仿ls -l以列表形式出当前工作目录下的所有文件(包括子目录) 需显示的文件属性有: 文件类型 权限 硬链接数 所有者用户名 所有者所在组用户名 文件大小 最后修改时间 #include <iostream> #include ... 阅读详情

相关推荐

Linux中使用lsls -l,ls -ld等命令在查看文件文件夹时有啥不同?

test文件夹a.text文件b的文件夹。

weixin_46190361的博客 956

Linux之ls只显示文件或者文件

文件是以 "-"开头 , 文件夹是 d, 所以这就是后面grep的内容。只显示文件 ls -l | grep ^-只显示文件ls -l | grep ^d。^是正则表达 匹配输入字符串开始的位置。ls -l 之后会得到下面的内容。

荷塘月色 4639

Linux_ls查看文件目录的命令,参数大全

1.ls 不加任何参数,表示查询当前目录下的文件/文件夹2.ls 后面加上路径,表示查询该路径下的文件/文件夹3.ls -a -a参数,表示查询所有的文件/文件夹,也包括以.开头的隐藏文件 4. ls -l -l参数,表示查询文件的详细信息7.ls -l 后面加文件名,如果想查看具体某个文件的详细信息,可以再加上它的文件名8.ls -d 只显示当前目录自身,通常和-l搭配使用来显示当前目录自身的权限和属性信息9.ls -

m0_62744009的博客 4307

linux ls -l详细讲解 文件权限

linux 学习 ls -l命令 文件权限

weixin_57663206的博客 5126

linux查看某个文件夹的大小(ls命令、du命令详解)

linux查看某个文件夹的大小(ls命令、du命令详解)

write less , do more 3万+

ls -l /dev/ttyUSB 报错 ls: 无法访问 ‘/dev/ttyUSB‘: 没有那个文件目录

1, sudo rm -r /dev/ttyUSB02,sudo mknod /dev/ttyUSB0 c 188 03.ls -l /dev/ttyUSB0

2301_79753674的博客 561

ls -l /usr/bin/dockerd # 检查二进制文件 ls: 无法访问/usr/bin/dockerd: 没有那个文件目录 解决方法

docker启动报错

m0_49611292的博客 467

Linux统计文件/目录数量ls -l | grep "^-" | wc -l匹配开头和结尾

Linux统计文件数量 ls -l | grep "^-" | wc -l “^-”  一般文件 “^d” 目录文件 shell/vim中^表示开头 cat repatterns | grep -P "th$"匹配结尾关键字

weixin_34252090的博客 852

Linux中ls -l、ls -d和ls -ld的显示内容与区别

        当前用户的家目录~和根目录/下,ls -l(查看当前目录所有的文件目录的详细信息)、ls -d(只显示当前文件夹)、ls -ld(查看当前目录本身的权限与属性信息)的区别与显示内容。 理解性提示: -:普通文件 b:块设备文件,如硬盘、光盘等 d:目录文件 c:字符设备文件,如键盘、鼠标等 l:链接文件 p:管道文件,与shell编程有关的文件 目录一、当前用户的家目录~基本信息三种形式二、当前用户的根目录/基

galaxy的博客 2万+

Linux部署04-ls命令的参数和选项,主体,参数,选项,ls / 查看根目录下的文件夹,-a的意思是列出全部选项 ls -a home全部文件,.代表着隐藏的文件夹,-l 选项,以列表竖向的形式展

ls / 查看根目录下的文件夹 Places点击Computer -a的意思是列出全部的选项 在Linux当中 .代表着隐藏的文件-l 选项,以列表竖向的形式展现内容,展现更多信息 ls -l -a ls -la ls -al 三种方法格式 ls -la /代表着全部展示出来 ls -lh / 可以查看文件大小,h必须搭配l进行使用 ls命令相关介绍

weixin_54048131的博客 370

Linux 系统查看当前正在运行的某个进程的详细执行脚本和目录ls -l /proc/PID/cwd和 ls -l /proc/PID/exe

ps/procps。

qq_15821487的博客 3476

Linux学习总结(一)文件目录

Linux 系统目录结构 登录系统后,在当前命令窗口下输入命令: ls / 你会看到如下图所示: 树状目录结构: 以下是对这些目录的解释: 1./bin: bin是Binary的缩写, 这个目录存放着最经常使用的命令。 /boot: 这里存放的是启动Linux时使用的一些核心文件,包括一些连接文件以及镜像文件。 /dev : dev是Device(设备)的缩写, 该目录下存放的是Linux的外部设备,在Linux中访问设备的方式和访问文件的方式是相同的。 /etc: 这个目录用来存

bureau123的博客 343

Linux系统中ll 与ls -l 的区别

我们可以看到ll指令的内容更加详细,他会把隐藏文件以及上级本级目录也显示出来,但是ls -l只会显示普通的文件(广义,包含文件夹)。

HarryQUQ的博客 873

ls -l到stat:C语言实现Linux文件信息获取与格式化输出

在Linux系统编程中,文件元数据(metadata)是理解文件系统状态的核心概念,它包含了文件类型、权限、所有者、大小和时间戳等关键信息。其底层原理是通过系统调用与内核交互,从文件的inode节点中读取这些二进制数据。stat系列系统调用(包括stat、lstat和fstat)正是实现这一过程的技术桥梁,它们将inode中的原始信息填充到struct stat结构体中,为上层应用提供标准化的数据接口。这项技术的工程价值在于,它使得开发者能够以编程方式精确获取和操控文件属性,是构建文件管理工具、监控系统和安

weixin_33843947的博客 385

Linux基础——目录处理命令ls

命令格式与目录处理命令ls 命令格式:命令 [-选项][参数] 参数就是命令操作的对象 例如: ls -la /etc 说明: 1.个别命令使用不遵循此格式 2.当有多个选项时,可以写在一起 3.简化选项与完整选项 -a –all 目录处理命令:ls 命令名称:ls 命令英文原意:list 目录 命令所在路径:/bin/ls 执行权限:所有用户 功能描述:显示目录文件 语法:ls 选项[-ald][文件目录] -a 显示所有...

爱编程的晖哥的博客 1534

Linux虚拟机目录管理命令---ls命令

格式: ls -l 文件名 简写(ll)-a : 显示当前目录中的所有文件名 (含隐藏文件)eg: ls dir1 显示当前dir1目录中的文件名。-i : 显示当前文件名及属性信息。: 查看上级的上级的上级目录中有哪些文件 (最多到根目录截止): 显示当前目录中的文件名(不含隐藏文件) 等价于ls命令。abc : 查看上级目录abc中有哪些文件ls :显示目录中的文件及其属性信息。: 查看上一级目录中的文件名。

small__crab的博客 748

ls(list显示目录文件

ls(list显示目录文件ls()列出文件夹(多个选项可一起使用,效果会叠加,不分前后顺序,可以连着用al,la) 所在路径:/bin/ls 命令格式:命令 [-选项] [参数] 例:ls -la /etc 选项: -a 显示所有文件,包括隐藏文件(all) -l 详细信息显示(long) -d 查看目录属性 (directory) -h 适合人类查看(human)不能显示文件夹的大小,只能显示出文件的大小,显示文件夹大小看du [root@hos

a1991376352的博客 2767

Linux / Mac 下 基本的 bash shell 命令详解(cd 、ls

Linux / Mac 下 基本的 bash shell 命令遍历目录 cdcd destinationcd命令可以带单个参数destination,用以制定你想切换到的目录名。如果用户没有指定目标路径,将会切换到当前用户主目录目录路径参数可以使用两种方式表达: 绝对文件路径 用户可在虚拟目录中采用==绝对文件路径==来引用目录名。绝对文件路径定义了在虚拟目录结构中该目录的确切位置,以虚拟目

海渊_haiyuan的博客 9221

Linux命令-Directory Navigation-ls(重点)

Linux命令-Directory Navigation-ls

深度安全实验室 552
上一篇: 哲学家问题 POSIX 信号量
下一篇: source insight 宏 添加函数注释
vanpire110
博客等级 码龄17年 20粉丝 15原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值