Linux下tree命令C/C++实现(以树状格式列出目录的内容)

news2024/11/24 12:40:57

在UNIX/LINUX系统中,tree是一个递归目录列表程序,它生成文件的深度缩进列表。在没有参数的情况下,树将列出当前目录中的文件。当给定目录参数时,树依次列出在给定目录中找到的所有文件或目录。列出找到的所有文件和目录后,树将返回列出的文件和目录总数。有一些选项可以更改输出中使用的字符,以及使用颜色输出。

tree命令类似于以列出文件和目录而闻名的ls命令。唯一的区别是tree命令以类似树的方式输出文件和目录。默认情况下不会安装此命令。 键入以下命令以使用yum命令:

yum install tree

tree命令介绍

Tree是一个递归目录列表程序,它生成文件的深度缩进列表,如果设置了LS_COLORS环境变量并且输出到tty。在没有参数的情况下,树将列出当前目录中的文件。当给定目录参数时,树将列出在
依次给出每个目录。列出找到的所有文件/目录后,树将返回列出的文件和/或目录总数。


tree选项:

在Linux中使用tree命令

  • 运行无任何参数的树命令

在包含多个文件/目录的任何目录中,输入不带任何参数的tree命令,如下所示:


输出显示当前工作目录中的文件和目录。注意目录的内容是如何缩进的。在最底部,您将找到目录和文件的总数。

  • 列出特定目录的内容

要列出特定目录的内容,请在tree命令中提及该名称。

tree test_dir

如果目录位于另一个目录中,也可以提及该目录的路径。

  • 在树输出中显示隐藏文件

要显示隐藏的文件,请使用-a标志和tree命令。


如果有隐藏文件,可以在列表中看到以点开头的文件。

  • 仅列出目录

要仅以树状方式列出目录,请使用-d标志和tree命令。


输出仅显示目录。目录总数在底部给出。

  • 带有完整路径前缀的列表

要列出带有完整路径前缀的文件,请在tree命令中使用-f标志。

对树命令输出进行排序

tree命令还提供了对输出进行排序的选项。这些选项如下:

-v: 按版本对输出进行排序。
-r: 按相反的字母顺序对输出进行排序。
-t: 按上次修改时间而不是按字母顺序对输出进行排序。

tree -r time/

  • 在输出中显示附加信息

可以使用标志在列表中显示其他信息。文件权限、用户ID等信息。用于显示其他信息的标志如下:

-p: 打印每个文件的文件类型和权限(与ls-l相同)。
-u: 打印文件的用户名或UID(如果没有可用的用户名)。
-s: 打印每个文件的大小(以字节为单位)以及名称。
-D: 打印所列文件的上次修改时间的日期。

tree -u io/

tree -s sync/

Linux下tree命令C/C++实现

int main(int argc, char **argv)
{
	...

  charset = getcharset();
  if (charset == NULL && strcmp(nl_langinfo(CODESET), "UTF-8") == 0) {
    charset = "UTF-8";
  }



  memset(utable,0,sizeof(utable));
  memset(gtable,0,sizeof(gtable));
  memset(itable,0,sizeof(itable));

  optf = TRUE;
  for(n=i=1;i<argc;i=n) 
  {
		n++;
		if (optf && argv[i][0] == '-' && argv[i][1]) 
		{
			  for(j=1;argv[i][j];j++) 
			  {
					switch(argv[i][j]) 
					{
						case 'N':
						  Nflag = TRUE;
						  break;
						case 'q':
						  qflag = TRUE;
						  break;
						case 'Q':
						  Qflag = TRUE;
						  break;
						case 'd':
						  dflag = TRUE;
						  break;
						case 'l':
						  lflag = TRUE;
						  break;
						case 's':
						  sflag = TRUE;
						  break;
						case 'h':
						  hflag = TRUE;
						  sflag = TRUE;
						  break;
						case 'u':
						  uflag = TRUE;
						  break;
						case 'g':
						  gflag = TRUE;
						  break;
						case 'f':
						  fflag = TRUE;
						  break;
						case 'F':
						  Fflag = TRUE;
						  break;
						case 'a':
						  aflag = TRUE;
						  break;
						case 'p':
						  pflag = TRUE;
						  break;
						case 'i':
						  noindent = TRUE;
						  _nl = "";
						  break;
						case 'C':
						  force_color = TRUE;
						  break;
						case 'n':
						  nocolor = TRUE;
						  break;
						case 'x':
						  xdev = TRUE;
						  break;
						case 'P':
						  if (argv[n] == NULL) 
						  {
								fprintf(stderr,"tree: missing argument to -P option.\n");
								exit(1);
						  }
						  pattern = argv[n++];
						  break;
						case 'I':
						  if (argv[n] == NULL) 
						  {
								fprintf(stderr,"tree: missing argument to -I option.\n");
								exit(1);
						  }
						  ipattern = argv[n++];
						  break;
						case 'A':
						  ansilines = TRUE;
						  break;
						case 'S':
						  charset = "IBM437";
						  break;
						case 'D':
						  Dflag = TRUE;
						  break;
						case 't':
						  cmpfunc = mtimesort;
						  break;
						case 'c':
						  cmpfunc = ctimesort;
						  cflag = TRUE;
						  break;
						case 'r':
						  reverse = TRUE;
						  break;
						case 'v':
						  cmpfunc = versort;
						  break;
						case 'U':
						  cmpfunc = NULL;
						  break;
						case 'X':
						  Hflag = FALSE;
						  Xflag = TRUE;
						  break;
						case 'J':
						  Jflag = TRUE;
						  break;
						case 'H':
						  Hflag = TRUE;
						  Xflag = FALSE;
						  if (argv[n] == NULL) 
						  {
								fprintf(stderr,"tree: missing argument to -H option.\n");
								exit(1);
						  }
						  host = argv[n++];
						  sp = "&nbsp;";
						  break;
						case 'T':
						  if (argv[n] == NULL) 
						  {
								fprintf(stderr,"tree: missing argument to -T option.\n");
								exit(1);
						  }
						  title = argv[n++];
						  break;
						case 'R':
						  Rflag = TRUE;
						  break;
						case 'L':
						  if ((sLevel = argv[n++]) == NULL) 
						  {
								fprintf(stderr,"tree: Missing argument to -L option.\n");
								exit(1);
						  }
						  Level = strtoul(sLevel,NULL,0)-1;
						  if (Level < 0) 
						  {
								fprintf(stderr,"tree: Invalid level, must be greater than 0.\n");
								exit(1);
						  }
						  break;
						case 'o':
						  if (argv[n] == NULL) 
						  {
								fprintf(stderr,"tree: missing argument to -o option.\n");
								exit(1);
						  }
						  outfilename = argv[n++];
						  break;
						case '-':
						  if (j == 1) 
						  {
								if (!strcmp("--", argv[i])) 
								{
								  optf = FALSE;
								  break;
								}
								if (!strcmp("--help",argv[i])) 
								{
								  usage(2);
								  exit(0);
								}
								if (!strcmp("--version",argv[i])) 
								{
								  char *v = version+12;
								  printf("%.*s\n",(int)strlen(v)-1,v);
								  exit(0);
								}
								if (!strcmp("--inodes",argv[i])) 
								{
								  j = strlen(argv[i])-1;
								  inodeflag=TRUE;
								  break;
								}
								if (!strcmp("--device",argv[i])) 
								{
								  j = strlen(argv[i])-1;
								  devflag=TRUE;
								  break;
								}
								if (!strcmp("--noreport",argv[i])) 
								{
								  j = strlen(argv[i])-1;
								  noreport = TRUE;
								  break;
								}
								if (!strcmp("--nolinks",argv[i])) 
								{
								  j = strlen(argv[i])-1;
								  nolinks = TRUE;
								  break;
								}
								if (!strcmp("--dirsfirst",argv[i])) 
								{
								  j = strlen(argv[i])-1;
								  dirsfirst = TRUE;
								  break;
								}
								if (!strncmp("--filelimit",argv[i],11)) 
								{
								  j = 11;
								  if (*(argv[i]+11) == '=') 
								  {
										if (*(argv[i]+12)) 
										{
										  flimit=atoi(argv[i]+12);
										  j = strlen(argv[i])-1;
										  break;
										}
								  }
								  if (argv[n] != NULL) 
								  {
									flimit = atoi(argv[n++]);
									j = strlen(argv[i])-1;
								  } 
								  else 
								  {
									fprintf(stderr,"tree: missing argument to --filelimit\n");
									exit(1);
								  }
								  break;
								}
								if (!strncmp("--charset",argv[i],9))
								{
									  j = 9;
									  if (*(argv[i]+j) == '=') 
									  {
											if (*(charset = (argv[i]+10))) 
											{
											  j = strlen(argv[i])-1;
											  break;
											}
									  }
									  if (argv[n] != NULL) 
									  {
											charset = argv[n++];
											j = strlen(argv[i])-1;
									  } 
									  else 
									  {
										initlinedraw(1);
										exit(1);
									  }
									  break;
								}
								if (!strncmp("--si", argv[i], 4)) 
								{
									  j = strlen(argv[i])-1;
									  sflag = TRUE;
									  hflag = TRUE;
									  siflag = TRUE;
									  break;
								}
								if (!strncmp("--du",argv[i],4)) 
								{
									  j = strlen(argv[i])-1;
									  sflag = TRUE;
									  duflag = TRUE;
									  break;
								}
								if (!strncmp("--prune",argv[i],7)) 
								{
									  j = strlen(argv[i])-1;
									  pruneflag = TRUE;
									  break;
								}
								if (!strncmp("--timefmt",argv[i],9)) 
								{
									  j = 9;
									  if (*(argv[i]+j) == '=') 
									  {
										if (*(argv[i]+ (++j))) 
										{
											  timefmt=scopy(argv[i]+j);
											  j = strlen(argv[i])-1;
											  break;
										}
									  } 
									  else if (argv[n] != NULL) 
									  {
										timefmt = scopy(argv[n]);
										n++;
										j = strlen(argv[i])-1;
									  } 
									  else 
									  {
										fprintf(stderr,"tree: missing argument to --timefmt\n");
										exit(1);
									  }
									  Dflag = TRUE;
									  break;
								}
								if (!strncmp("--ignore-case",argv[i],13)) 
								{
									  j = strlen(argv[i])-1;
									  ignorecase = TRUE;
									  break;
								}
								if (!strncmp("--matchdirs",argv[i],11)) 
								{
									  j = strlen(argv[i])-1;
									  matchdirs = TRUE;
									  break;
								}
								if (!strncmp("--sort",argv[i],6)) 
								{
									  j = 6;
									  if (*(argv[i]+j) == '=') 
									 {
											if (*(argv[i]+(++j))) 
											{
												  stmp = argv[i]+j;
												  j = strlen(argv[i])-1;
											} 
											else 
											{
												  fprintf(stderr,"tree: missing argument to --sort=\n");
												  exit(1);
											}
									  } 
									  else if (argv[n] != NULL) 
									  {
											stmp = argv[n++];
									  } 
									  else 
									  {
											fprintf(stderr,"tree: missing argument to --sort\n");
											exit(1);
									  }
									  cmpfunc = (void *)1;
									  for(k=0;sorts[k].name;k++) 
									  {
											if (strcasecmp(sorts[k].name,stmp) == 0) 
											{
												  cmpfunc = sorts[k].cmpfunc;
												  break;
											}
									  }
									  if (cmpfunc == (void *)1) 
									  {
											fprintf(stderr,"tree: sort type '%s' not valid, should be one of: ", stmp);
											for(k=0; sorts[k].name; k++)
											  printf("%s%c", sorts[k].name, sorts[k+1].name? ',': '\n');
											exit(1);
									  }
									  break;
								}
						  }
						default:
						  fprintf(stderr,"tree: Invalid argument -`%c'.\n",argv[i][j]);
						  usage(1);
						  exit(1);
						  break;
					}
			  }
		} 
		else 
		{
			  if (!dirname) dirname = (char **)xmalloc(sizeof(char *) * (q=MINIT));
			  else if (p == (q-2)) dirname = (char **)xrealloc(dirname,sizeof(char *) * (q+=MINC));
			  dirname[p++] = scopy(argv[i]);
		}
  }

...

  return 0;
}

运行结果:


If you need the complete source code of tree, please add WeChat number (c17865354792)​

总结

Linux中的tree命令。tree命令有助于了解系统的文件结构。有关tree命令的更多信息,请参阅其man手册页。

Welcome to follow WeChat official account【程序猿编码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/114808.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

机器学习从零到入门 逻辑回归详解

逻辑回归详解 从零开始 从理论到实践一、逻辑回归的理解1.1、字面含义1.2、引申1.2.1、阶跃函数的引入1.2.2、可导的阶跃函数 - Logistic函数1.2.3、Logistic回归1.2.4、回归系数的求解 - 极大似然估计二、sklearn的使用参考一、逻辑回归的理解 前面介绍了线性回归及其衍生回归…

目标检测之YOLOv4算法分析

基本原理 网络结构 CSPDarknet53 最后三个箭头指向输出即三种特征图 SPP 解决多尺度问题 对于同一个特征输出图&#xff0c;进行三种maxpool2d操作&#xff0c;然后将三种操作的输出进行叠加 PANet 融合上采样、下采样等特征&#xff0c;深度方向拼接 PANet由五个核心模…

Unity 3D工具栏与常用工具||Unity 3D 菜单栏与快捷键

Unity 3D 的工具栏&#xff08; Toolbar &#xff09;中&#xff0c;一共包含 13 种常用工具&#xff0c;如下所列。 一. 平移窗口工具&#xff1a;平移场景视图画面。 快捷键&#xff1a;鼠标中键 二. 位移工具&#xff1a;针对单个或两个轴向做位移。 快捷键&#xff1a;W…

stm32f407VET6 系统学习 day04 DHT11 温湿度传感器

1.温湿度的一次完整的数据包括&#xff1a; 一次完整的数据传输为40bit,高位先出。 数据格式: 8bit湿度整数数据 8bit湿度小数数据 8bi温度整数数据 8bit温度小数数据 8bit校验&#xff08;校验和的值是前四个字节数据的和) 用户MCU发送一次开始信号后,DHT11从低功耗模式转…

灰色关联分析(系统分析+综合评价)

系统分析&#xff1a;探究系统中哪个自变量对系统的影响最大 灰色关联分析的基本思想是根据序列曲线几何形状的相似程度来判断其联系是否紧密。曲线越接近&#xff0c;相应序列之间的关联度就越大&#xff0c;反之就越小 应用一、进行系统分析&#xff08;国内比赛合适&#xf…

idea创建spring项目

文章目录一、Maven 项目的创建1.1 创建一个空项目2.2 新建一个模块2.3 创建Maven模块2.4 添加resources目录2.5 选定maven版本二、添加spring2.1 添加依赖2.2 创建applicationContext文件2.3 添加bean一、Maven 项目的创建 1.1 创建一个空项目 新建一个空项目&#xff1b;随便…

十、Express 路由

路由是Express框架中最重要的功能之一&#xff0c;在Express中&#xff0c;路由指的是客户端的请求与服务器处理函数之间的映射关系&#xff0c;Express中的路由分别由请求的类型&#xff08;GET/POST等&#xff09;、请求的URL地址和处理函数三个部分组成的&#xff1b; APP级…

【C++】侯捷C++面向对象高级编程(下)

转换函数(conversion function) 可以把"这种"东西&#xff0c;转化为"别种"东西。 即Fraction ——> double class Fraction { public:Fraction(int num, int den 1) :m_numerator(num), m_denominator(den) {}operator double()const {return ((dou…

hashmap哈希map是什么?什么时候需要使用hashmap?C实现hashmap示例

背景 对于C程序员&#xff0c;尤其是嵌入式C程序员&#xff0c;hashmap使用的相对较少&#xff0c;所以会略显陌生&#xff0c;hashmap其实涉及到2个概念&#xff0c;分别是哈希(hash)、map。 哈希hash&#xff1a;是把任意长度输入通过蓝列算法变换成固定长度的输出&#xff…

CSS Flex 布局的 flex-direction 属性讲解

flex-direction 设置了主轴&#xff0c;从而定义了弹性项目放置在弹性容器中的方向。 Flexbox 是一种单向布局概念&#xff0c;可将弹性项目视为主要以水平行或垂直列布局。 .container {flex-direction: row | row-reverse | column | column-reverse; }几种支持的属性&#x…

devServer和VueCli | Webpack

文章目录devServer和VueCliwebpack-dev-servercontentBase模块热替换开启HMRhotOnly host配置port open compressproxyresolveextensions和alias配置如何区分开发环境devServer和VueCli webpack-dev-server contentBase 模块热替换 开启HMR hotOnly host配置 port open compres…

IMX6ULL学习笔记(15)——GPIO接口使用【官方SDK方式】

一、GPIO简介 i.MX6ULL 芯片的 GPIO 被分成 5 组,并且每组 GPIO 的数量不尽相同&#xff0c;例如 GPIO1 拥有 32 个引脚&#xff0c; GPIO2 拥有 22 个引脚&#xff0c; 其他 GPIO 分组的数量以及每个 GPIO 的功能请参考 《i.MX 6UltraLite Applications Processor Reference M…

有没有股票实时行情的同花顺l2接口?

对于个人投资者而言&#xff0c;一般看盘平台软件系统中&#xff0c;通过自定义公式接口&#xff0c;可以获取到股票实时行情的。例如同花顺l2接口系统会通过一些输入的公式就能查找指定的股票行情了&#xff0c;那么这个就相当于股票实时行情的API接口一样的道理&#xff0c;输…

加密解决HTTP协议带来的安全问题

HTTP协议默认是采取明文传输的&#xff0c;容易被中间人窃听、拦截、篡改&#xff0c;存在安全隐患。 常见提高安全性的方法是对通信内容进行加密&#xff0c;再进行传输&#xff0c;常见的加密方式有 不可逆加密&#xff1a;单向散列函数 可逆加密&#xff1a;对称加密、非对称…

从模型到服务——iDesktopX处理自动化工具实现BIM模型到三维服务发布

目录前言一、 处理自动化模型二、 算子参数设置1、 使用迭代数据集打开导出后的BIM模型2、 移除重复点、重复面和重复子对象3、 模型生成缓存4、 三维切片缓存发布5、 执行结果前言 BIM模型在SuperMap实际使用的业务流程中常常需要在桌面产品中生成缓存&#xff0c;然后通过iS…

安装和配置MySQL

首先前往官网下载mysql社区版&#xff08;不要钱&#xff09; MySQL Community Serverhttps://dev.mysql.com/downloads/windows/installer/8.0.html 甲骨文比较鸡贼&#xff0c;会要求你注册一个账号。但是下面有一行小字&#xff0c;直接点击下载就好了 双击后直接按…

Blender——苹果的纹理绘制

效果图 前言 在进行纹理绘制之前&#xff0c;首先要具有苹果三维模型。 关于苹果的建模请参考&#xff1a;Blender——“苹果”建模_行秋的博客 1.苹果UV的展开 1.1首先点击UV Eidting&#xff0c;滑动三维模型&#xff0c;使其大小适中。 1.2打开左上角的UV选区同步&#x…

使用idb操作IndexedDB

使用idb操作IndexedDB 译自&#xff1a;https://www.hackernoon.tech/use-indexeddb-with-idb-a-1kb-library-that-makes-it-easy-8p1f3yqq GitHub地址&#xff1a;https://github.com/jakearchibald/idb 文章目录使用idb操作IndexedDB前置条件本文承诺上手demo1&#xff1a;…

python中的encode()和decode()函数

前言&#xff1a; 我们知道&#xff0c;计算机是以二进制为单位的&#xff0c;也就是说计算机只识别0和1,也就是我们平时在电脑上看到的文字&#xff0c;只有先变成0和1&#xff0c;计算机才会识别它的意思。这种数据和二进制的转换规则就是编码。计算机的发展中&#xff0c;有…

【SpringCloud Alibaba】Sentinel流控规则

概念 流控规则 直接&#xff08;默认&#xff09; QPS快速失败 线程数直接控制 QPSWarming up QPS排队等待 关联 链路 具体启动Sentinel的步骤可以参考我的上一篇文章。 概念 资源名&#xff1a;唯一名称&#xff0c;默认请求路径 针对来源&#xff1a;Sentinel可以针…