9 stable releases
| 1.0.14 | May 6, 2026 |
|---|---|
| 1.0.12 | Feb 5, 2026 |
| 1.0.9 | Dec 15, 2025 |
| 1.0.4 | Nov 22, 2025 |
#111 in Filesystem
64KB
898 lines
Tree2
A high-performance directory tree visualization tool written in Rust with colors, emojis, and comprehensive ignore file support. Available as both CLI tool and library crate. Fully compatible with Linux tree command options.
🎦 Demo
✨ Features
- 🎨 Colorful Output: Beautiful colored output with emojis for better visualization
- 📊 File Sizes: Human-readable file sizes with color-coded values
- 🚫 Multiple Ignore Files: Automatic support for
.gitignore,.dockerignore,.pt, and more - 🔒 Default System Exclusions:
.git,.svn, and other system folders hidden by default - 🎯 Exception Patterns: Wildcard and regex support to override ignore rules
- 📋 Clipboard Support: Copy tree output directly to clipboard with
-cflag - 🐧 Linux
treeCompatible: Supports all major flags from the Linuxtreecommand - ⚡ Blazing Fast: Optimized Rust implementation for maximum performance
- 🌐 Cross-Platform: Works on Windows, macOS, Linux (x86_64, ARM64, ARMv7, i686)
- 📦 Library & CLI: Available as both command-line tool and Rust library
- 🦀 Memory Safe: Rust's safety guarantees ensure reliability
🎨 Color Scheme
- Folders: Bright Yellow (#FFFF00) with 📁 emoji
- Files: Bright Cyan (#00FFFF) with 📄 emoji
- Symlinks: Bright Green (#00FF80) with
->target path - Size Values: Light magenta (#FF80FF) — White on red background if size is 0
- Size Units: Orange (#FFB380)
- Meta info (permissions, date, owner): Gray (#A0A0A0)
- Permission Denied: White on red background with 🔒 emoji
🛠️ Installation
Using Pre-built Binaries (Recommended)
Download the appropriate binary for your platform from GitHub Releases:
Linux
# x86_64 (Standard)
wget https://github.com/cumulus13/tree2/releases/latest/download/tree2-linux-amd64.tar.gz
tar xzf tree2-linux-amd64.tar.gz
sudo mv tree2 /usr/local/bin/
# ARM64 (Raspberry Pi 4+, AWS Graviton)
wget https://github.com/cumulus13/tree2/releases/latest/download/tree2-linux-arm64.tar.gz
tar xzf tree2-linux-arm64.tar.gz
sudo mv tree2 /usr/local/bin/
# ARMv7 (Raspberry Pi 2/3)
wget https://github.com/cumulus13/tree2/releases/latest/download/tree2-linux-armv7.tar.gz
tar xzf tree2-linux-armv7.tar.gz
sudo mv tree2 /usr/local/bin/
Windows
Download from releases page and extract to a folder in your PATH.
macOS
# Intel Macs
wget https://github.com/cumulus13/tree2/releases/latest/download/tree2-macos-amd64.tar.gz
tar xzf tree2-macos-amd64.tar.gz
sudo mv tree2 /usr/local/bin/
# Apple Silicon (M1/M2/M3)
wget https://github.com/cumulus13/tree2/releases/latest/download/tree2-macos-arm64.tar.gz
tar xzf tree2-macos-arm64.tar.gz
sudo mv tree2 /usr/local/bin/
From crates.io
cargo install tree2
From Source
git clone https://github.com/cumulus13/tree2
cd tree2
cargo install --path .
🌐 Platform Support
Tree2 supports 11 different platforms:
| OS | Architectures |
|---|---|
| 🐧 Linux | x86_64, ARM64, ARMv7, i686 (+ musl variants) |
| 🪟 Windows | x86_64, ARM64, i686 |
| 🍎 macOS | Intel (x86_64), Apple Silicon (ARM64) |
For detailed platform information, see PLATFORM_SUPPORT.md.
📖 Usage
Basic Usage
# Show current directory tree
tree2
# Show specific directory
tree2 /path/to/directory
# Copy output to clipboard (plain text, no ANSI codes)
tree2 -c
# Show system folders (.git, etc.)
tree2 -a
# Show version info
tree2 -V
# Show help
tree2 --help
Note:
-his--human-readable(Linuxtreecompatibility), not--help. Use--helpfor the help screen.
📋 Full Options Reference
Usage: tree2 [OPTIONS] [PATH]
Arguments:
[PATH] Target directory [default: .]
Original tree2 flags
| Flag | Description |
|---|---|
-V, --version |
Print version information |
-e, --exclude <NAME>... |
Exclude directories/files by exact name |
-c, --clipboard |
Copy output to clipboard (plain text) |
-i, --ignore-file <FILE>... |
Specific ignore file(s) to use |
--exception <PATTERN>... |
Exception patterns — matching entries will NOT be excluded (supports wildcards and regex: prefix) |
-a, --all |
Show hidden system folders (.git, .svn, etc.) |
Listing & filtering (Linux tree compatible)
| Flag | Description |
|---|---|
-d, --dirs-only |
List directories only |
-f, --full-path |
Print full path prefix for each entry |
-l, --follow-links |
Follow symbolic links like directories |
-L, --level <N> |
Max display depth |
-P, --pattern <GLOB> |
Only show files matching wildcard pattern (e.g. "*.rs") |
-I, --ignore-pattern <GLOB> |
Exclude files matching wildcard pattern (e.g. "*.o") |
--ignore-case |
Case-insensitive -P / -I matching |
--dirsfirst |
List directories before files |
-t, --sort-time |
Sort by last modification time (oldest first) |
-r, --reverse |
Reverse sort order |
--filelimit <N> |
Don't descend directories with more than N entries |
--prune |
Omit empty directories from output |
-x, --xdev |
Stay on current filesystem (don't cross mount points) — Unix only |
File metadata display (Linux tree compatible)
| Flag | Description |
|---|---|
-p, --protections |
Print permissions like [drwxr-xr-x] |
-u, --owner |
Print file owner name / UID — Unix only |
-g, --group |
Print group name / GID — Unix only |
-s, --size |
Print size in raw bytes |
-h, --human-readable |
Human-readable size (already the default; explicit flag for compat) |
--si |
Human-readable with SI units (powers of 1000) |
-D, --date |
Print last modification date/time |
-F, --classify |
Append type indicators: / dirs, * executables, @ symlinks, | FIFOs, = sockets |
--du |
Report directory size as accumulation of all contained file sizes |
--inodes |
Print inode number — Unix only |
--device |
Print device number — Unix only |
Output control (Linux tree compatible)
| Flag | Description |
|---|---|
--noreport |
Suppress the final N directories, M files summary |
-o, --output <FILE> |
Write output to file (plain text, no ANSI codes) |
-n, --nocolor |
Disable all ANSI colors |
-q, --quote-chars |
Replace non-printable characters with ? |
-Q, --quote |
Wrap filenames in double quotes |
💡 Usage Examples
Depth & filtering
# Show only 2 levels deep
tree2 -L 2
# Show only Rust source files
tree2 -P "*.rs"
# Show only directories, 3 levels deep
tree2 -d -L 3
# Exclude all .o files
tree2 -I "*.o"
# Case-insensitive pattern match
tree2 -P "*.RS" --ignore-case
Sorting
# Directories first
tree2 --dirsfirst
# Sort by modification time, newest last
tree2 -t
# Reverse order
tree2 -r
# Newest first (reverse time sort)
tree2 -t -r
Metadata display
# Show permissions
tree2 -p
# Show permissions + owner + group
tree2 -p -u -g
# Show modification date
tree2 -D
# Show size in bytes
tree2 -s
# Show size with SI units (1000-based)
tree2 --si
# Show accumulated directory sizes
tree2 --du
# Show inode numbers (Unix only)
tree2 --inodes
# Show all metadata at once
tree2 -p -u -g -D --inodes
Output
# Save to file (no ANSI codes)
tree2 -o output.txt
# Copy to clipboard
tree2 -c
# No colors
tree2 -n
# Suppress file/dir count summary
tree2 --noreport
# Quote all filenames
tree2 -Q
Combining flags
# Use only .gitignore, keep all .log files
tree2 -i .gitignore --exception "*.log"
# Show all files matching pattern, dirs first, with dates
tree2 -P "*.toml" --dirsfirst -D
# Complex metadata view with depth limit
tree2 -p -u -D -L 3 --dirsfirst
# Stay on current filesystem only (Unix)
tree2 -x
# Full path + classify indicators
tree2 -f -F
Exception patterns
# Wildcard: keep all .log files even if in .gitignore
tree2 --exception "*.log"
# Exact match: keep node_modules
tree2 --exception "node_modules"
# Regex pattern: keep test/spec Rust files
tree2 --exception "regex:^(test|spec)_.*\.rs$"
# Multiple exceptions
tree2 --exception "*.log" "*.md" "important_*"
📄 Creating a .pt File
The .pt file works like .gitignore but is specific to tree2:
cat > .pt << EOF
# Custom ignores for tree2
*.tmp
*.cache
local_settings.json
dev_notes/
EOF
# tree2 will automatically use it
tree2
📋 Output Example
📂 /home/user/project/
├── 📁 src/
│ ├── 📄 main.rs (12.45 KB)
│ └── 📄 lib.rs (2.34 KB)
├── 📁 tests/
│ └── 📄 integration_test.rs (2.10 KB)
├── 📄 Cargo.toml (1.20 KB)
├── 📄 README.md (4.50 KB)
└── 🔒 [Permission Denied]
2 directories, 4 files
With metadata flags (-p -u -D)
📂 /home/user/project/
├── [-rwxr-xr-x] alice [2025-11-22 14:30] 📁 src/
│ └── [-rw-r--r--] alice [2025-11-20 09:15] 📄 main.rs (12.45 KB)
└── [-rw-r--r--] alice [2025-11-21 11:00] 📄 Cargo.toml (1.20 KB)
1 directory, 2 files
Clipboard Output
When using -c, the output copied to clipboard is plain text without ANSI color codes, making it perfect for pasting into documentation, emails, Markdown files, or code reviews.
🚀 Performance
- Zero-cost abstractions
- Minimal memory allocations
- Efficient directory traversal
- Fast pattern matching with HashSet
- Optimized wildcard matching algorithm
📚 Library Usage
Add to your Cargo.toml:
[dependencies]
tree2 = "2.0"
Basic Example
use tree2::TreeBuilder;
fn main() {
let tree = TreeBuilder::new()
.path(".")
.excludes(vec!["target", ".git"])
.build();
tree.print();
}
Advanced Example
use tree2::{TreeBuilder, TreeConfig};
fn main() {
let config = TreeConfig {
path: ".".into(),
excludes: vec!["target".into(), ".git".into()],
ignore_files: vec![".gitignore".into(), ".dockerignore".into()],
exceptions: vec!["*.log".into()],
show_all: false,
max_depth: Some(5),
};
let tree = TreeBuilder::from_config(config).build();
tree.print();
// Or get the output as string
let output = tree.to_string();
println!("{}", output);
}
🔧 Dependencies
[dependencies]
clap = { version = "4.0", features = ["derive"] }
dunce = "1.0.4"
cli-clipboard = "0.4"
clap-version-flag = "1.0.5"
regex = "1.10"
🏗️ Building from Source
Prerequisites
- Rust 1.70 or higher
- Cargo
Build Steps
git clone https://github.com/cumulus13/tree2
cd tree2
# Debug build
cargo build
# Release build
cargo build --release
# Run tests
cargo test
# Run clippy
cargo clippy -- -D warnings
# Check formatting
cargo fmt --all -- --check
Cross-Compilation
# Install target
rustup target add aarch64-unknown-linux-gnu
# Build
cargo build --release --target aarch64-unknown-linux-gnu
# Or use cross for easier cross-compilation
cargo install cross
cross build --release --target aarch64-unknown-linux-gnu
🤝 Contributing
We welcome contributions!
- Fork the repository
- Create your feature branch (
git checkout -b feature/amazing-feature) - Commit your changes (
git commit -m 'Add some amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
📄 License
This project is licensed under the MIT License - see the LICENSE file for details.
👤 Author
Hadi Cahyadi
- Email: [email protected]
- GitHub: cumulus13
💬 Support
If you encounter any issues or have questions:
- Check the Issues page
- Create a new issue with detailed description
- Read the Documentation
- Contact: [email protected]
📝 Changelog
v1.0.14 (Latest)
- ✨ Added: Full Linux
treecommand compatibility - ✨ Added:
-L/--levelmax depth flag - ✨ Added:
-d/--dirs-onlydirectories-only listing - ✨ Added:
-f/--full-pathfull path prefix display - ✨ Added:
-P/--patternand-I/--ignore-patternwildcard filtering - ✨ Added:
--ignore-casefor case-insensitive pattern matching - ✨ Added:
--dirsfirstsort order - ✨ Added:
-t/--sort-timeand-r/--reversesort flags - ✨ Added:
-p/--protectionspermissions display (Unix) - ✨ Added:
-u/--ownerand-g/--groupmetadata (Unix) - ✨ Added:
-s/--sizeraw bytes,-h/--human-readable,--sisize flags - ✨ Added:
-D/--datemodification date display - ✨ Added:
-F/--classifytype indicator suffixes - ✨ Added:
--filelimitdirectory entry limit - ✨ Added:
--pruneempty directory pruning - ✨ Added:
--duaccumulated directory sizes - ✨ Added:
--noreportsuppress summary line - ✨ Added:
-o/--outputwrite to file - ✨ Added:
-n/--nocolordisable ANSI colors - ✨ Added:
-q/--quote-charsand-Q/--quotefilename quoting - ✨ Added:
-x/--xdevstay on current filesystem (Unix) - ✨ Added:
--inodesand--deviceinode/device display (Unix) - ✨ Added: Summary line
N directories, M filesat end of output - ✨ Added: Symlink display with
->target in bright green - ✨ Added: Meta-info prefix colored in gray
- 🐛 Fixed: Cross-platform build — all Unix-specific APIs gated with
#[cfg(unix)] - 🐛 Fixed: All clippy warnings (
is_multiple_of,sort_by_key, argument count) - ⚠️ Breaking:
-his now--human-readable(Linux tree compat). Use--helpfor help.
v1.0.13
- 🐛 Fixed: Wildcard pattern matching in ignore files (
.gitignore,.pt, etc.) - 🐛 Fixed: Tree connector logic for correct display
- ✨ Added: Default system folder exclusion (
.git,.svn, etc.) - ✨ Added:
-a/--allflag to show hidden system folders - 📚 Improved: Documentation and troubleshooting guides
v1.0.10
- ✨ Added: Multiple ignore file support (
.gitignore,.dockerignore,.pt, etc.) - ✨ Added: Exception patterns with wildcard, regex, and exact match
- ✨ Added: Selective ignore file usage with
-iflag - ✨ Added: Custom
.ptignore file support - 🚀 Improved: Pattern matching algorithm
- 📚 Added: Comprehensive documentation (QUICKSTART, EXAMPLES, TROUBLESHOOTING)
v1.0.9
- ✅ Fixed exact match exclusion (
.gitno longer excludes.github) - ✨ Added clipboard support with
-cflag - 📝 Improved version info with
-Vflag - 🎨 Better color scheme with true color support
- ⚡ Performance optimizations
🔗 Links
- QUICKSTART Guide - Get started in 5 minutes
- Examples - 48+ practical usage examples
- Platform Support - Detailed platform information
- Changelog - Full version history
Enjoy blazing-fast directory visualization with Tree2! 🚀🦀
Dependencies
~3–20MB
~247K SLoC