Command line print file tree list: tree

Time:2021-10-18

Linux & Mac

1. Downloadtree lib

//mac
brew install tree
//centos
yum install tree
//ubuntu
apt-get install tree

usage

//Show all files
tree
//Display depth 2 layers
tree -L 2

2. Command find combination

find . -print | sed -e 's;[^/]*/;|____;g;s;____|; |;g' > structure.txt

Remove node_ module

find . -print | grep -v "node" | sed -e 's;[^/]*/;|____;g;s;____|; |;g' > structure.txt

Disadvantages: you cannot select the print depth, or you need a higher level of syntax. Use it here for the time being. Enough.

Windows

The tree command comes with windows. Only directories are displayed by default

//Show directory only
tree

//Display file
tree /f

//Output to file
tree /f > structure.txt

However, because I am not familiar with windows commands, I don’t want to spend time learning windows commands. Then you can install a git shell or recommend using cmder.

Customization

Write a list manually. Preorder traversal:

/**
 *First traverse the postorder traversal, first output the root node, and then output the child nodes
 * Created by Ryan Miao on 9/24/17.
 */
public class PostorderTraversal {

    @Test
    public void testPostOrder() {
        String root = "/Users/ryan/workspace/learning/hexo-blog-src";
        int stop = 3;
        ArrayList<String> ignores = Lists.newArrayList(".git", ".deploy_git", "node_modules", ".DS_Store");

        printTree(root, stop, ignores);
    }

    private void printTree(String rootFile, int stop, List<String> ignores) {
        printTree(new File(rootFile), 0, stop, ignores, false, true);
    }

    private void printTree(File rootFile, int level, int stop, List<String> ignores, boolean isLastChild, boolean isParentLast) {
        String name = rootFile.getName();
        if (level > stop || ignores.stream().anyMatch(name::contains)) {
            return;
        }
        if (level == 0) {
            System.out.println(".");
        } else {
            prettyPrint(level, rootFile, isLastChild, isParentLast);
        }

        if (rootFile.isDirectory()) {
            File[] files = rootFile.listFiles();
            if (files != null) {
                int length = files.length;
                for (int i = 0; i < length; i++) {
                    if (i == length - 1) {
                        //
                        printTree(files[i], level + 1, stop, ignores, true, isLastChild);
                    } else {
                        printTree(files[i], level + 1, stop, ignores, false, isLastChild);
                    }
                }
            }
        }
    }

    private void prettyPrint(int level, File file, boolean isLastChild, boolean isParentLast) {
        StringBuilder sb = new StringBuilder();
        if (level != 1) {
            sb.append("│");
        }

        for (int i = 0; i < level - 2; i++) {
            if (isParentLast && i == level - 3) {
                sb.append("    ");
                break;
            }
            sb.append("   |");
        }
        if (level != 1) {
            sb.append("   ");
        }

        if (isLastChild) {
            sb.append("└──");
        } else {
            sb.append("├──");
        }

        sb.append(file.getName());
        System.out.println(sb.toString());
    }
}

At present, there is a bug, that is, after recursion to depth, grandson cannot know whether his grandfather is the final leaf, so the dotted line is not removed. However, it is still possible to use it simply.
console output:

.
├──_config.yml
├──db.json
├──package-lock.json
├──package.json
├──public
│   ├──2017
│   |   ├──05
│   |   ├──06
│   |   ├──07
│   |   ├──08
│   |   └──09
│   ├──404.html
│   ├──about
│   |   └──index.html
│   ├──archives
│   |   ├──2017
│   |   ├──index.html
│   |   └──page
│   ├──baidusitemap.xml
│   ├──categories
│   |   ├──Cache
│   |   ├──Git
│   |   ├──Hexo
│   |   ├──index.html
│   |   ├──Java
│   |   ├──Java8
│   |   ├──Javascript
│   |   ├──Linux
│   |   ├──MySQL
│   |   ├──ReactJS
│   |   ├──redis
│   |   ├──Server
│   |   ├──Spring
│   |   ├──Tools
│|♪ - Thinking
│|└ - Reading
│   ├──CNAME
│   ├──css
│   |   └──main.css
│   ├──gallery
│   |   └──index.html
│   ├──images
│   |   ├──algolia_logo.svg
│   |   ├──alipay.jpg
│   |   ├──avatar.gif
│   |   ├──avatar.jpeg
│   |   ├──bk.bmp
│   |   ├──bk.jpg
│   |   ├──bk.png
│   |   ├──bk2.jpg
│   |   ├──cc-by-nc-nd.svg
│   |   ├──cc-by-nc-sa.svg
│   |   ├──cc-by-nc.svg
│   |   ├──cc-by-nd.svg
│   |   ├──cc-by-sa.svg
│   |   ├──cc-by.svg
│   |   ├──cc-zero.svg
│   |   ├──loading.gif
│   |   ├──placeholder.gif
│   |   ├──quote-l.svg
│   |   ├──quote-r.svg
│   |   ├──searchicon.png
│   |   └──wechat.jpg
│   ├──index.html
│   ├──js
│   |   └──src
│   ├──lib
│   |   ├──algolia-instant-search
│   |   ├──canvas-nest
│   |   ├──canvas-ribbon
│   |   ├──fancybox
│   |   ├──fastclick
│   |   ├──font-awesome
│   |   ├──Han
│   |   ├──jquery
│   |   ├──jquery_lazyload
│   |   ├──pace
│   |   ├──three
│   |   ├──ua-parser-js
│   |   └──velocity
│   ├──links
│   |   └──index.html
│   ├──page
│   |   ├──2
│   |   └──3
│   ├──search.xml
│   ├──sitemap.xml
│   └──tags
│       ├──ArrayList
│       ├──banner
│       ├──Dropwizard
│       ├──EhCache
│       ├──Feign
│       ├──Git
│       ├──Hexo
│       ├──index.html
│       ├──Java
│       ├──Java8
│       ├──Javascript
│       ├──Lambda
│       ├──Linux
│       ├──Mac
│       ├──MySQL
│       ├──NodeJS
│       ├──ReactJS
│       ├──reading
│       ├──redis
│       ├──Server
│       ├──Spring
│       ├──SpringMVC
│       ├──team
│       ├──UTF-8
│       ├──vim
│       ├──Webpack
│       ├──Windows
│└ - Code cloud
├──README.md
├──scaffolds
│   ├──draft.md
│   ├──page.md
│   └──post.md
├──source
│   ├──404.html
│   ├──_data
│   |   └──links.yml
│   ├──_posts
│   |   ├──banner-ascii-2-txt.md
│   |   ├──dropwizard-feign.md
│|♪ introduction to ehcache 3 spring integration.md
│   |   ├──git-rebase.md
│   |   ├──hello-react-js.md
│   |   ├──hello-world.md
│   |   ├──hexo-github-oschina.md
│   |   ├──hexo-next-hypercomments.md
│   |   ├──hexo-next-shang.md
│   |   ├──http-server-static.md
│   |   ├──Java-ArrayList-remove.md
│|♪ java-utf8-iso-source of garbled code.md
│   |   ├──java8-in-action-2.md
│   |   ├──java8-lambda.md
│   |   ├──js-cros.md
│   |   ├──mac-install-mysql.md
│   |   ├──mac-install-redis.md
│   |   ├──react-tutorial-1.md
│   |   ├──reading-schedule.md
│   |   ├──spring400.md
│   |   ├──switch-to-oschina.md
│   |   ├──team-first-chance.md
│   |   ├──tree.md
│   |   ├──vim.md
│   |   └──why-string-is-immutable.md
│   ├──about
│   |   └──index.md
│   ├──categories
│   |   └──index.md
│   ├──CNAME
│   ├──gallery
│   |   └──index.md
│   ├──images
│   |   ├──alipay.jpg
│   |   ├──avatar.jpeg
│   |   ├──bk.bmp
│   |   ├──bk.jpg
│   |   ├──bk.png
│   |   ├──bk2.jpg
│   |   └──wechat.jpg
│   ├──links
│   |   └──index.md
│   └──tags
│       └──index.md
├──themes
│   ├──landscape
│   |   ├──_config.yml
│   |   ├──Gruntfile.js
│   |   ├──languages
│   |   ├──layout
│   |   ├──LICENSE
│   |   ├──package.json
│   |   ├──README.md
│   |   ├──scripts
│   |   └──source
│   └──next
│       ├──.bowerrc
│       ├──.editorconfig
│       ├──.hound.yml
│       ├──.javascript_ignore
│       ├──.jshintrc
│       ├──.stylintrc
│       ├──.travis.yml
│       ├──_config.yml
│       ├──bower.json
│       ├──gulpfile.coffee
│       ├──languages
│       ├──layout
│       ├──LICENSE
│       ├──package.json
│       ├──README.cn.md
│       ├──README.md
│       ├──scripts
│       ├──source
│       └──test
└──thems-bak
│   └──next
│       ├──_config.yml
│       └──custom.styl

reference resources

The tree command terminal under MAC displays your directory tree structure