C语言实现的ls命令源码分享

C语言实现的ls命令源码分享,第1张

C语言实现的ls命令源码分享

ls 指令可以说是Linux下最常用的指令之一。它有许多的选项,其中有许多是很有用的`,你能否了解呢?下面列出了 ls 指令的绝大多数选项。

1.列出具体文件 #ls -al //这个最常用,可是往往又不彻底符合要求,

2.列出一切子目录的文件:#ls -R //上个指令仅仅列出了本目录下的一切目录和文件,可是目录下的文件不会循环的列出。

3.若是文件过多一屏看不完,怎么办?并且,关于想找到许多文件中的某个文件的姓名。

3.1分屏显现:#ls -l|more //能在当时屏退出,很有用,但不能一页一页翻屏

#ls -l|less //能用pgup,pgdw 翻页,但不能在当时方位退出

3.2横向输出尽可能多的显现文件姓名:#ls -m

-a 列出目录下的一切文件,包含以 . 最初的隐含文件。//常用

-m 横向输出文件名,并以“,”作分格符。

-c 输出文件的 i 节点的修正时刻,并以此排序。

-R 列出一切子目录下的文件。

-l 列出文件的具体信息。

-s 在每个文件名后输出该文件的巨细。

-k 以 k 字节的方式表明文件的巨细。

-i 输出文件的 i 节点的索引信息。

随便写了个最简单的,供你参考

vim test.c

**********************************

#include <stdio.h>

#include <unistd.h>

int main()

{

char * buff[] = {"ls", "-R", NULL}

execv("/bin/ls", buff)

return 0

}

*******************************

linux终端下:gcc test.c -o test

./test

运行没问题

#include <stdio.h>

#include <sys/types.h>

#include <dirent.h>

#include <sys/stat.h>

#include <string.h>

void do_ls(char[])

void dostat(char *)

void show_file_info( char *, struct stat *)

void mode_to_letters( int , char[] )

char * uid_to_name( uid_t )

char * gid_to_name( gid_t )

main(int ac, char *av[])

{

    if( ac == 1 )

    do_ls( "." )          /*显示当前目录*/

    else

    while( --ac ){

        printf("%s:\n", *++av)   /*显示参数指定的目录*/

        do_ls( *av )

    }

}

void do_ls( char dirname[] )

{

    DIR *dir_ptr

    struct dirent *direntp

    if( (dir_ptr = opendir( dirname )) == NULL)            /*打开目录,成功则返回 DIR 结构指针*/

    fprintf(stderr, "ls1: cannot open %s\n", dirname)

    

    else

    {

    while( ( direntp = readdir( dir_ptr ) ) != NULL )

         dostat( direntp->d_name )

    closedir( dir_ptr )

    }

}

void dostat( char *filename )

{

    struct stat info

    if( stat( filename, &info ) == -1 )

    perror( filename )

    else

    show_file_info( filename, &info )

}

void show_file_info( char *filename, struct stat *info_p )

{

    char *uid_to_name(), *ctime(), *gid_to_name(), *filemode()

    void mode_to_letters()

    char modestr[11]

    mode_to_letters( info_p->st_mode, modestr )      /*模式到字符的转换*/

    printf("%s", modestr )                           /*输出模式标识符*/

    printf("%4d", (int)info_p->st_nlink)

    printf(" %-8s", uid_to_name(info_p->st_uid))

    printf("%-8s", gid_to_name(info_p->st_gid))

    printf("%8ld  ", (long)info_p->st_size)

    printf("%.12s ", 4 + ctime(&info_p->st_mtime))

    printf("%s\n",filename)    

}

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_IXOTH)  str[7] = 'r'

    if(mode & S_IXOTH)  str[8] = 'w'

    if(mode & S_IXOTH)  str[9] = 'x'

}

#include <pwd.h>

    char *uid_to_name( uid_t uid )

/*

*返回和 uid 相应的用户名的指针

*/

    {

    struct passwd *getpwuid(), *pw_ptr

    static char numstr[10]

    if( ( pw_ptr = getpwuid( uid ) ) == NULL ) {

        sprintf(numstr, "%d", uid)      /*没有对应的用户名则 uid 存入 numstr,返回后以字符串的形式打印 uid*/

        return numstr

    }

    else

        return pw_ptr->pw_name          /*打印用户名*/

    }

#include <grp.h>

    char *gid_to_name( gid_t gid )

    {

    struct group *getgrgid(), *grp_ptr

    static char numstr[10]

    if( ( grp_ptr = getgrgid(gid) ) == NULL ){

        sprintf(numstr, "%d", gid)

        return numstr

    }

    else

        return grp_ptr->gr_name

    }


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/8986294.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-23
下一篇 2023-04-23

发表评论

登录后才能评论

评论列表(0条)

保存