在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 = " ";
						  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【程序猿编码】



















