Linux用C语言模拟‘ls‘命令

简介: Linux用C语言模拟‘ls‘命令

原理


linux下使用C语言,通过调用Linux系统的目录访问API来实现一个类似于ls命令功能的小程序,主要是可以练习程序对命令的解析和目录API函数的使用。


实现代码

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

int aflag = 0,lflag = 0;

void display_file(char *fname , char *nname)
{
  struct stat buf;
  struct tm *t;
  int i;

  if(stat(fname,&buf) < 0)
  {
    perror("stat error\n");
    return ;
  }

  switch(buf.st_mode & S_IFMT)
  {
  case S_IFSOCK:  printf("s");  break;
  case S_IFLNK: printf("l");  break;
  case S_IFREG: printf("-");  break;
  case S_IFBLK: printf("b");  break;
  case S_IFDIR: printf("d");  break;
  case S_IFCHR: printf("c");  break;
  case S_IFIFO: printf("p");  break;
  }

  for(i = 8 ; i >= 0 ; i--)
  {
    if(buf.st_mode & (1 << i))
    {
      if(i % 3 == 2)  printf("r");
      if(i % 3 == 1)  printf("w");
      if(i % 3 == 0)  printf("x");
    }
    else
      printf("-");
  }


  printf(" %d ",buf.st_nlink);

  printf("%s ",getpwuid(buf.st_uid)->pw_name);
  printf("%s ",getgrgid(buf.st_gid)->gr_name);

  printf("%ld ",buf.st_size);

  t = localtime(&buf.st_mtime);
  printf("%d-%02d-%02d  %02d:%02d ",t->tm_year+1900,t->tm_mon+1,t->tm_mday,
      t->tm_hour,t->tm_min);
  printf("%s\n",nname);

  return ;
}

void display_dir(char *dir)
{
  DIR *mydir;
  struct dirent *myitem;
  char fname[256];

  if((mydir = opendir(dir)) == NULL)
  {
    perror("fail to opendir!\n");
    return ;
  }
  while((myitem = readdir(mydir)) != NULL)
  {
    if(myitem->d_name[0] == '.' && 
     !aflag)//如果if条件成立的就继续下一次循环,否则往下执行
      continue;

    if(lflag)//ls -l -a dir
    {

      sprintf(fname,"%s/%s",dir,myitem->d_name);
      display_file(fname,myitem->d_name);
    }
    else // ls dir
      printf("%s  ",myitem->d_name);
  }
  printf("\n");
  closedir(mydir);
  return ;
}

int main(int argc,char *argv[])
{
  int ch,i;
  struct stat buf;

  opterr = 0;
  //解析命令
  while((ch = getopt(argc,argv,"la")) != -1)
  {
    switch(ch)
    {
    case 'a': aflag = 1;  break;
    case 'l': lflag = 1;  break;
    default:  printf("wrong option:%c\n",optopt);return -1;
    }
  }

  if(optind == argc)//no argument //ls .没有带参直接ls当前目录
    display_dir(".");

  for(i = optind; i < argc ; i++) //ls name1 name2....
  {
    if(stat(argv[i],&buf) < 0)
    {
      perror("fail to stat!\n");
      return -1;
    }
    if(S_ISDIR(buf.st_mode))//dir
    {
      printf("%s:\n",argv[i]);
      display_dir(argv[i]);
    }
    else//file
      if(lflag)//ls -l file
        display_file(argv[i],argv[i]);
      else// ls file
        printf("%s",argv[i]);
    printf("\n");
  }

  return 0;
}


编译

gcc test.c -o test


运行


直接运行,输出当前目录的文件:

./test 
test  test.c   


跟个参数,输出详细信息:

./test -l
-rwxrwxr-x 1 root root 13637 2020-04-15  07:37 test
-rw-r--r-- 1 root root 2409 2014-03-25  06:01 test.c


输出隐藏文件:

./test -a
test  .test.c.bak  test.c  ..  .
目录
相关文章
|
2月前
|
Linux 网络安全 数据安全/隐私保护
Linux 超级强大的十六进制 dump 工具:XXD 命令,我教你应该如何使用!
在 Linux 系统中,xxd 命令是一个强大的十六进制 dump 工具,可以将文件或数据以十六进制和 ASCII 字符形式显示,帮助用户深入了解和分析数据。本文详细介绍了 xxd 命令的基本用法、高级功能及实际应用案例,包括查看文件内容、指定输出格式、写入文件、数据比较、数据提取、数据转换和数据加密解密等。通过掌握这些技巧,用户可以更高效地处理各种数据问题。
169 8
|
1月前
|
Linux Shell
Linux 10 个“who”命令示例
Linux 10 个“who”命令示例
62 14
Linux 10 个“who”命令示例
|
15天前
|
Linux
linux查看目录下的文件夹命令,find查找某个目录,但是不包括这个目录本身?
通过本文的介绍,您应该对如何在 Linux 系统中查看目录下的文件夹以及使用 `find` 命令查找特定目录内容并排除该目录本身有了清晰的理解。掌握这些命令和技巧,可以大大提高日常文件管理和查找操作的效率。 在实际应用中,灵活使用这些命令和参数,可以帮助您快速定位和管理文件和目录,满足各种复杂的文件系统操作需求。
42 8
|
24天前
|
Ubuntu Linux
Linux 各发行版安装 ping 命令指南
如何在不同 Linux 发行版(Ubuntu/Debian、CentOS/RHEL/Fedora、Arch Linux、openSUSE、Alpine Linux)上安装 `ping` 命令,详细列出各发行版的安装步骤和验证方法,帮助系统管理员和网络工程师快速排查网络问题。
123 20
|
24天前
|
网络协议 Linux 应用服务中间件
kali的常用命令汇总Linux
kali的常用命令汇总linux
54 7
|
2月前
|
Linux 数据库
Linux中第一次使用locate命令报错?????
在Linux CentOS7系统中,使用`locate`命令时出现“command not found”错误,原因是缺少`mlocate`包。解决方法是通过`yum install mlocate -y`或`apt-get install mlocate`安装该包,并执行`updatedb`更新数据库以解决后续的“can not stat”错误。
44 9
|
2月前
|
监控 网络协议 Linux
Linux netstat 命令详解
Linux netstat 命令详解
|
2月前
|
运维 监控 网络协议
运维工程师日常工作中最常用的20个Linux命令,涵盖文件操作、目录管理、权限设置、系统监控等方面
本文介绍了运维工程师日常工作中最常用的20个Linux命令,涵盖文件操作、目录管理、权限设置、系统监控等方面,旨在帮助读者提高工作效率。从基本的文件查看与编辑,到高级的网络配置与安全管理,这些命令是运维工作中的必备工具。
199 3
|
2月前
|
存储 运维 Linux
如何在 Linux 系统中使用 envsubst 命令替换环境变量?
`envsubst` 是 Linux 系统中用于替换文本中环境变量值的实用工具。本文分三部分介绍其工作原理、使用方法及实际应用,包括配置文件替换、脚本执行中环境变量替换和动态生成文件等场景,帮助用户高效利用 `envsubst` 进行开发和运维工作。
96 4
|
2月前
|
Linux
在 Linux 系统中,`find` 命令
在 Linux 系统中,`find` 命令
44 1