Linux下tree命令C/C++实现(以树状格式列出目录的内容)
创始人
2024-05-01 01:59:40
0

在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;in++;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【程序猿编码

相关内容

热门资讯

喜欢穿一身黑的男生性格(喜欢穿... 今天百科达人给各位分享喜欢穿一身黑的男生性格的知识,其中也会对喜欢穿一身黑衣服的男人人好相处吗进行解...
发春是什么意思(思春和发春是什... 本篇文章极速百科给大家谈谈发春是什么意思,以及思春和发春是什么意思对应的知识点,希望对各位有所帮助,...
网络用语zl是什么意思(zl是... 今天给各位分享网络用语zl是什么意思的知识,其中也会对zl是啥意思是什么网络用语进行解释,如果能碰巧...
为什么酷狗音乐自己唱的歌不能下... 本篇文章极速百科小编给大家谈谈为什么酷狗音乐自己唱的歌不能下载到本地?,以及为什么酷狗下载的歌曲不是...
家里可以做假山养金鱼吗(假山能... 今天百科达人给各位分享家里可以做假山养金鱼吗的知识,其中也会对假山能放鱼缸里吗进行解释,如果能碰巧解...
华为下载未安装的文件去哪找(华... 今天百科达人给各位分享华为下载未安装的文件去哪找的知识,其中也会对华为下载未安装的文件去哪找到进行解...
四分五裂是什么生肖什么动物(四... 本篇文章极速百科小编给大家谈谈四分五裂是什么生肖什么动物,以及四分五裂打一生肖是什么对应的知识点,希...
怎么往应用助手里添加应用(应用... 今天百科达人给各位分享怎么往应用助手里添加应用的知识,其中也会对应用助手怎么添加微信进行解释,如果能...
客厅放八骏马摆件可以吗(家里摆... 今天给各位分享客厅放八骏马摆件可以吗的知识,其中也会对家里摆八骏马摆件好吗进行解释,如果能碰巧解决你...
苏州离哪个飞机场近(苏州离哪个... 本篇文章极速百科小编给大家谈谈苏州离哪个飞机场近,以及苏州离哪个飞机场近点对应的知识点,希望对各位有...