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