treestat
Command-line tool that shows source file counts per directory and language in a tree view.
- Flexible filtering: language presets via
--langor custom extensions via--ext. - Configurable counting: only direct files in each directory (
direct) or full subtree aggregation (tree). - Script‑friendly output: human‑readable text or stable JSON for CI, dashboards, and scripts.
⚙️ Installation
The recommended way to install treestat is via uv so that it is managed as a Python tool:
Or install from PyPI:
You can also install the native Rust binary from crates.io:
🚀 Usage
Count C/C++ files up to depth 3 under the current directory:
Example (text) output:
all file statistics (Tree View):
============================================================
llvm-project/ (52970 files)
├── bolt/ (241 files)
├── clang/ (18264 files)
├── clang-tools-extra/ (3003 files)
├── compiler-rt/ (3417 files)
├── cross-project-tests/ (228 files)
├── flang/ (665 files)
├── libc/ (1959 files)
├── libclc/ (248 files)
├── libcxx/ (9179 files)
├── libcxxabi/ (105 files)
├── libunwind/ (43 files)
├── lld/ (219 files)
├── lldb/ (4765 files)
├── llvm/ (6866 files)
├── llvm-libgcc/ (2 files)
├── mlir/ (1873 files)
├── openmp/ (744 files)
├── polly/ (893 files)
├── pstl/ (97 files)
├── third-party/ (154 files)
└── utils/ (5 files)
============================================================
Total matching files: 52970
Directories containing files: 6516
Languages (Top 5): c=12000,c++=38000,python=2970
To get JSON for automation:
📚 CLI reference
treestat [PATH] [OPTIONS]
PATH: target directory (default:.)--lang <LANG[,LANG...]>: language preset(s) from embedded Linguist data (repeatable, aliases supported)--ext <LIST>: custom extensions (comma-separated, supportsrsor.rs)--headers <include|exclude|only>: header-file policy (default:include)--count-mode <direct|tree>: counting mode (default:tree)--max-depth <N>: maximum directory depth (root=0)--min-count <N>: hide directories below this count--show-empty: include0 filesdirectories--follow-symlinks: follow symlinks (default: disabled)--exclude <PATTERN>: exclude path pattern (repeatable)--no-gitignore: disable.gitignore-based filtering--hidden: include hidden files/directories--format <text|json>: output format (default:text)--json-pretty: pretty-print JSON
⚖️ Default behavior
.gitignorepatterns are enabled by default.- Hidden entries are excluded by default unless
--hiddenis set. - Common build/output directories are excluded by default:
.git,target,build,out,node_modules,third_party,dist. dirs_with_filesdoes not include the root directory.
🧪 Development
📜 License
MIT License. See LICENSE for details.
🤝 Contributing
Contributions are welcome! Feel free to open an issue or submit a pull request.
📞 Support
- GitHub Issues: Report a bug
- GitHub README: View the latest docs