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  ..  .
目录
相关文章
|
1天前
|
Linux Shell 开发工具
【Linux】:文本编辑与输出命令 轻松上手nano、echo和cat
【Linux】:文本编辑与输出命令 轻松上手nano、echo和cat
8 0
|
1天前
|
Linux 数据安全/隐私保护
Linux常用命令大全:一杯水时间让你掌握!(附目录和快捷键)(下)
Linux常用命令大全:一杯水时间让你掌握!(附目录和快捷键)
9 2
|
1天前
|
Linux Shell Python
Linux常用命令大全:一杯水时间让你掌握!(附目录和快捷键)(上)
Linux常用命令大全:一杯水时间让你掌握!(附目录和快捷键)
13 2
|
1天前
|
缓存 网络协议 Linux
Linux 网络命令大全,详细归纳!
【4月更文挑战第24天】
21 3
Linux 网络命令大全,详细归纳!
|
2天前
|
运维 监控 Linux
【专栏】别再只会使用简单的 ping 命令了,Linux 中这些高级 ping 命令可以提高工作效率!
【4月更文挑战第28天】Linux中的ping命令不仅用于基础网络连通性检查,还有许多高级功能。了解如`-c`(设置数据包数量)、`-i`(设置间隔时间)和`-w`(设置超时时间)等选项能提升效率。进阶技巧包括自定义数据包大小(`-s`)、详细统计信息(`-v`)、持续ping(`-t`)、指定源地址(`-S`)和多目标ping。这些在网络性能测试、故障排查和监控中极其有用。注意权限、参数选择,并结合其他工具以准确解读结果。提升网络管理技能,善用ping命令的全部潜力。
|
2天前
|
监控 Linux
【专栏】如何检查 Linux 内存使用量是否耗尽?这 5 个命令堪称绝了!
【4月更文挑战第28天】在 Linux 中,掌握检查内存使用情况至关重要,因为内存问题可能导致系统性能下降甚至崩溃。本文介绍了 5 个常用的检查内存命令:1) `free` 提供内存和交换区的详细信息;2) `top` 显示进程信息及内存使用;3) `vmstat` 输出系统综合信息,包括内存动态变化;4) `pidstat` 监控特定进程的内存使用;5) `/proc/meminfo` 文件提供系统内存详细数据。了解和使用这些命令能帮助用户及时发现并解决内存相关问题,确保系统稳定运行。
|
2天前
|
Linux 网络安全 数据处理
【专栏】Linux 超级强大的十六进制 dump 工具:XXD 命令,我教你应该如何使用!
【4月更文挑战第28天】Linux下的xxd命令是一个强大的二进制数据处理工具,用于十六进制转储和数据分析。它可以显示文件的十六进制和ASCII表示,方便查看内容、分析数据结构和比较文件。xxd支持指定输出格式、写入文件、数据提取和转换等功能。在网络安全分析、程序调试和数据恢复等领域有广泛应用。通过掌握xxd,用户能更深入理解和处理二进制数据。
|
2天前
|
安全 Linux 数据安全/隐私保护
【专栏】如何在 Linux 中使用 Chage 命令,修改 Linux 系统用户密码更改策略
【4月更文挑战第28天】`Chage` 命令在 Linux 中用于管理用户密码策略,包括有效期、过期警告和锁定。本文将介绍如何使用 `chage` 修改这些设置。通过 `chage -l` 查看用户策略,`-M` 设置最大有效期,`-W` 设置过期警告,`-I` 设置过期后锁定天数。文章还将探讨企业环境和特殊用户的应用案例,以及使用时的注意事项,如谨慎修改、通知用户和验证效果。了解并有效利用 `Chage` 可提升系统安全性和稳定性。
|
2天前
|
Linux
【专栏】如何在 Linux 中查找所有符号链接,这几个命令得会!
【4月更文挑战第28天】在Linux中,符号链接是特殊的文件类型,指向其他文件或目录。本文介绍了查找符号链接的三种方法:1) 使用`ls -l`查看文件类型为&#39;l&#39;的项;2) 使用`find / -type l`遍历文件系统;3) 使用`lsof -L`列出打开的链接。此外,还讨论了命令的详细用法、高级技巧和应用场景,并提供了实际案例。注意权限、系统负载和目标文件存在性等问题。掌握这些命令有助于管理和维护系统符号链接。
|
2天前
|
运维 网络协议 Linux
【专栏】运维工程师工作时最常用的 20 个 Linux 命令有哪些?建议收藏
【4月更文挑战第28天】本文介绍了运维工程师常用的20个Linux命令,包括`ls`、`cd`、`pwd`、`mkdir`、`rm`、`cp`、`mv`、`cat`、`more`、`less`、`head`、`tail`、`grep`、`find`、`chmod`、`chown`、`chgrp`、`ps`、`top`和`ifconfig`,帮助提升工作效率。此外,还提到了其他常用的命令如`df`、`free`、`tar`、`ssh`、`scp`、`ping`、`netstat`、`iptables`、`systemctl`、`hostname`等,建议运维人员掌握以应对各种运维场景。