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  ..  .
目录
相关文章
|
Linux 应用服务中间件 Shell
二、Linux文本处理与文件操作核心命令
熟悉了Linux的基本“行走”后,就该拿起真正的“工具”干活了。用grep这个“放大镜”在文件里搜索内容,用find这个“探测器”在系统中寻找文件,再用tar把东西打包带走。最关键的是要学会使用管道符|,它像一条流水线,能把这些命令串联起来,让简单工具组合出强大的功能,比如 ps -ef | grep 'nginx' 就能快速找出nginx进程。
1137 1
二、Linux文本处理与文件操作核心命令
linux命令—stat
`stat` 是 Linux 系统中用于查看文件或文件系统详细状态信息的命令。相比 `ls -l`,它提供更全面的信息,包括文件大小、权限、所有者、时间戳(最后访问、修改、状态变更时间)、inode 号、设备信息等。其常用选项包括 `-f` 查看文件系统状态、`-t` 以简洁格式输出、`-L` 跟踪符号链接,以及 `-c` 或 `--format` 自定义输出格式。通过这些选项,用户可以灵活获取所需信息,适用于系统调试、权限检查、磁盘管理等场景。
845 137
|
安全 Ubuntu Unix
一、初识 Linux 与基本命令
玩转Linux命令行,就像探索一座新城市。首先要熟悉它的“地图”,也就是/根目录下/etc(放配置)、/home(住家)这些核心区域。然后掌握几个“生存口令”:用ls看周围,cd去别处,mkdir建新房,cp/mv搬东西,再用cat或tail看文件内容。最后,别忘了随时按Tab键,它能帮你自动补全命令和路径,是提高效率的第一神器。
1816 58
|
存储 安全 Linux
Linux卡在emergency mode怎么办?xfs_repair 命令轻松解决
Linux虚拟机遇紧急模式?别慌!多因磁盘挂载失败。本文教你通过日志定位问题,用`xfs_repair`等工具修复文件系统,三步快速恢复。掌握查日志、修磁盘、验重启,轻松应对紧急模式,保障系统稳定运行。
1744 2
|
Unix Linux 程序员
Linux文本搜索工具grep命令使用指南
以上就是对Linux环境下强大工具 `grep` 的基础到进阶功能介绍。它不仅能够执行简单文字查询任务还能够处理复杂文字处理任务,并且支持强大而灵活地正则表达规范来增加查询精度与效率。无论您是程序员、数据分析师还是系统管理员,在日常工作中熟练运用该命令都将极大提升您处理和分析数据效率。
1002 16
|
缓存 监控 Linux
Linux内存问题排查命令详解
Linux服务器卡顿?可能是内存问题。掌握free、vmstat、sar三大命令,快速排查内存使用情况。free查看实时内存,vmstat诊断系统整体性能瓶颈,sar实现长期监控,三者结合,高效定位并解决内存问题。
1150 0
Linux内存问题排查命令详解
|
Linux 网络安全 开发工具
技术栈:这50条最常用的 Linux 命令你一定要会!
建议多在终端中实践,遇到不懂的命令就用 man 或 --help 了解详情!
2311 0
|
安全 Linux Shell
Linux系统中sudo命令的高效运用技巧。
用户可以通过sudo -l来列出自己目前可执行的命令列表,这有助于用户了解自己的权限范围。
500 0
|
监控 Linux Shell
linux命令
常用 Linux 命令汇总
|
Linux C++
每天一个linux命令(8):cp 命令
cp 命令是 Linux 中用于复制文件或目录的命令。它的名字来源于英文单词 copy。这个命令非常常用,特别是在需要备份文件或创建文件副本时。
841 0