For your convenience, TCDir is now available through winget:
winget install relmer.TCDirTCDir ("Technicolor Directory") is a fast, colorized directory listing tool for Windows consoles.
It's designed as a practical dir-style command with useful defaults (color by extension/attributes, Nerd Font file/folder icons, sorting, recursion, wide output, and a multi-threaded enumerator).
Settings can be persisted in a config file (~\.tcdirconfig), overridden via the TCDIR environment variable, or specified on the command line.
| Version | Highlights |
|---|---|
| 5.7 | Browse archives as folders (--Archives: .zip, .iso, .7z, .rar, .tar.*, ...) and print archive statistics with checksum verification (--Info, --Verify). PowerShell tab completion for switches and values (--Enable-Completion) |
| 5.6 | Install/uninstall Nerd Fonts system-wide (--install-nerdfonts, --uninstall-nerdfonts) with Windows Terminal profile configuration |
| 5.5 | Variable-width columns in wide mode (/W) — GNU ls-style per-column fitting; outlier truncation with … |
| 5.4 | Symlink, junction, and AppExecLink target display (→ target); ellipsize long target paths (…) |
| 5.3 | Config file support (.tcdirconfig) — persistent settings without environment variables |
| 5.2 | Interactive PowerShell alias configuration (--set-aliases, --get-aliases, --remove-aliases) |
| 5.1 | --Tree hierarchical directory view with depth control |
| 5.0 | Nerd Font file/folder icons (~200 extensions, ~65 directories) |
| 4.2 | Cloud sync status badges (OneDrive, iCloud), file owner, NTFS alternate data streams |
| 4.1 | - and -- style switch prefixes |
| 4.0 | Multi-threaded enumeration (2–4× faster recursive listings), ARM64 native binary |
See CHANGELOG.md for full release history.
Hat tip to Chris Kirmse whose excellent ZDir from the '90s was the original inspiration for TCDir.
Also available in Rust: RCDir is a parallel Rust implementation of TCDir with feature parity.
| Feature | dir |
TCDir | eza | lsd |
|---|---|---|---|---|
| Color-coded by extension & attribute | — | ✅ | ✅ | ✅ |
| Cloud sync status (OneDrive, iCloud) | — | ✅ | — | — |
| Nerd Font file/folder icons | — | ✅ | ✅ | ✅ |
| Tree view with full metadata | — | ✅ | ✅ | ✅ |
| Multi-threaded enumeration | — | ✅ | — | — |
Familiar dir switch syntax |
✅ | ✅ | — | — |
| ARM64 native binary | ✅ | ✅ | — | — |
| NTFS alternate data streams | ✅ | ✅ | — | — |
| Symlink/junction target display | — | ✅ | ✅ | ✅ |
| Configurable via environment variable | — | ✅ | ||
| Persistent config file | — | ✅ | ✅ | ✅ |
Browse inside archives (.zip, .iso, .7z, .rar, .tar.*, ...) |
— | ✅ | — | — |
| Archive statistics and checksum verification | — | ✅ | — | — |
| Interactive PowerShell alias setup | — | ✅ | — | — |
| PowerShell tab completion | — | ✅ | ✅ | ✅ |
| Nerd Font installer | — | ✅ | — | — |
LS_COLORS, EZA_COLORS) and, for eza, a few display settings from environment variables; TCDir reads switches and colors from TCDIR.
If you're not a winget enthusiast, youc an grab the latest binary for your architecture directly:
- TCDir.exe — x64 (Intel/AMD 64-bit)
- TCDir-ARM64.exe — ARM64 (Snapdragon, etc.)
Place the .exe somewhere on your PATH, or add its directory to your PATH.
See all releases on the Releases page.
TCDir includes a built-in alias configuration wizard. Run from PowerShell:
tcdir --set-aliasesThe wizard walks you through:
- Root alias — a short name (e.g.,
d) that maps totcdir - Sub-aliases — derived commands like
dt(tree),dw(wide),dd(dirs-only),ds(recursive),dsb(recursive bare) - Profile location — which PowerShell profile to save to, or output for the current session only
The generated aliases are PowerShell functions stored between marker comments in your profile. To inspect or remove them later:
tcdir --get-aliases # show configured aliases
tcdir --remove-aliases # interactive removal
tcdir --set-aliases --whatif # preview without writingBoth PowerShell 7+ (pwsh) and Windows PowerShell 5.1 (powershell) are supported — the wizard auto-detects which version launched it.
Run this from PowerShell to add tab completion for tcdir and your aliases to your profile:
tcdir --Enable-Completion # add or update the completion block
tcdir --Enable-Completion --whatif # preview the block without writing
tcdir --Disable-Completion # remove it; aliases stay--set-aliases offers to enable completion as its last step, and regenerates the completion block when the aliases change. Completion works without aliases too.
Press Tab after tcdir --Tr for --Tree, or Ctrl+Space after tcdir -- for every switch with its description. Values complete too: -O:, -A:, -T:, --Size= and --TreeIndent=. Switches that are already on the command line, or that conflict with it, aren't offered, and words that aren't switches complete as paths. Candidates come from the installed tcdir each time Tab is pressed, so a newer tcdir offers its new switches without a new setup step. Windows PowerShell 5.1 doesn't pass words that start with a single - to completers, so in 5.1 use / (/W, /Tree) or -- (--Tree).
- Windows 10/11
- PowerShell 7 (
pwsh) to run the build/test scripts - Visual Studio 2026 (v18.x)
- The free Community edition is fine, but any edition will work
- Workload: Desktop development with C++
- Individual components (usually included with the workload, but worth confirming):
- MSVC v14x x64/x86 build tools
- Windows 10/11 SDK
- C++ unit test framework (to build/run the
UnitTestproject) - Optional (ARM64 builds/tests): MSVC v14x ARM64 build tools
- The scripts use
vswhere.exeto locate MSBuild and the test runner
- Optional: VS Code (the repo includes
.vscode/tasks wired up toscripts/Build.ps1andscripts/RunTests.ps1)
Build:
- Visual Studio: open
TCDir.slnand Build Solution - VS Code: run a build task (e.g. Build Release x64 (no test))
- Command line:
pwsh -NoProfile -ExecutionPolicy Bypass -File .\scripts\Build.ps1 -Configuration Release -Platform x64 -Target Build
Run:
.\x64\Release\TCDir.exe.\ARM64\Release\TCDir.exe
Show help:
Basic syntax:
TCDIR [drive:][path][filename] [-A[[:]attributes]] [-O[[:]sortorder]] [-T[[:]timefield]] [-S] [-W] [-B] [-P] [-M] [--Env] [--Config] [--Settings] [--Owner] [--Streams] [--Icons] [--Tree] [--Archives] [--Info] [--Verify] [--Depth=N] [--TreeIndent=N] [--Size=Auto|Bytes]
Common switches:
-A[:]<attributes>: filter by file attributes-O[:]<sortorder>: sort results- both
-oeand-o:eforms are supported Nname,Eextension,Ssize,Ddate/time- prefix
-to reverse
- both
-T:<timefield>: select which timestamp to display and sort byCcreation time,Alast access time,Wlast write time (default)
-S: recurse into subdirectories-W: wide listing format-B: bare listing format-P: show performance timing information-M: enable multi-threaded enumeration (default); use-M-to disable--Env: showTCDIRenvironment variable help/syntax/current value--Config: show.tcdirconfigconfig file help/syntax and resolved file path--Settings: show current color/switch configuration with source tracking (default, config file, or env var)--Owner: display file owner (DOMAIN\User format); not allowed with--Tree--Streams: display NTFS alternate data streams--Icons: enable Nerd Font file/folder icons; use--Icons-to disable--Tree: hierarchical directory tree view; use--Tree-to disable--Archives: list the contents of an archive file (.zip,.iso,.7z,.rar,.tar, ...) given as a path, and recurse into archive files with-Sand--Tree; use--Archives-to disable--Info: print statistics for each archive that matches the targets instead of a listing; with-S, archives in subfolders and inside other archives are reported too--Verify: with--Info, read every archive entry and check its stored checksum--Depth=N: limit tree depth to N levels (requires--Tree)--TreeIndent=N: tree indent width per level, 1–8, default 4 (requires--Tree)--Size=Auto|Bytes:Autoshows abbreviated sizes (e.g.,8.90 KB);Bytesshows exact comma-separated sizes. Tree mode defaults toAuto, non-tree defaults toBytes--set-aliases: interactive wizard to configure PowerShell aliases for tcdir--Enable-Completion/--Disable-Completion: add or remove PowerShell tab completion for tcdir and its aliases--get-aliases: display all configured tcdir aliases and their source profiles--remove-aliases: interactive removal of tcdir aliases from profile files--whatif: dry-run modifier for--set-aliases,--remove-aliases,--Enable-Completionor--Disable-Completion(preview only, no file changes)--install-nerdfonts: download and install CaskaydiaCove Nerd Font system-wide, then optionally configure terminal profiles--uninstall-nerdfonts: remove Nerd Font terminal configuration and optionally remove the installed font files
Standard attributes: D (directory), H (hidden), S (system), R (read-only), A (archive)
Cloud sync attributes (OneDrive, iCloud, etc.):
O- cloud-only placeholder files (not locally available)L- locally available files (hydrated, can be dehydrated)V- pinned/always available files (won't be dehydrated)
Extended attributes:
X- not content indexed (excluded from Windows Search)I- integrity stream enabled (ReFS only)B- no scrub data (ReFS only)F- sparse fileU- unpinned (allow dehydration)
Use - prefix to exclude (e.g., /A:-H excludes hidden files).
When browsing cloud-synced folders (OneDrive, iCloud Drive, etc.), TCDir displays sync status symbols:
○(hollow) - cloud-only placeholder, not available offline◐(half) - locally available, can be dehydrated●(solid) - pinned, always available offline
When a Nerd Font is detected, the cloud symbols are automatically upgraded to dedicated NF glyphs (cloud-outline, cloud-check, pin).
When TCDir detects a Nerd Font installed, it automatically displays file and folder icons next to each entry — in normal, wide, and bare listing modes.
Detection works via:
- GDI glyph probe — renders a canary glyph to confirm Nerd Font symbols are available in the active console font
- System font enumeration — checks whether any installed font's name contains "Nerd Font" or a "NF", "NFM", or "NFP" suffix
- WezTerm detection — WezTerm bundles Nerd Font symbols natively, so icons are enabled automatically
- ConPTY detection — Windows Terminal, VS Code terminal, and other modern terminals are recognized
Icon mappings (~200 extensions, ~65 well-known directories) are aligned with the Terminal-Icons PowerShell module default theme.
Use --Icons to force icons on, or --Icons- to force them off, regardless of detection.
Tree mode displays the directory hierarchy with Unicode box-drawing connectors (├──, └──, │). All metadata columns (date, time, attributes, size, cloud status) appear at every level. Directories and files are sorted together (interleaved) rather than grouped.
tcdir --Tree— show full tree from the current directorytcdir --Tree --Depth=2— show only 2 levels deeptcdir --Tree --TreeIndent=2— narrower indentation (default is 4)tcdir --Tree *.cpp— show only.cppfiles; empty subdirectories are pruned
Tree mode uses abbreviated file sizes (--Size=Auto) by default for consistent column alignment across directories. Junction points and symlinks are listed but not expanded, preventing infinite cycles.
Incompatible with -W (wide), -B (bare), -S (recurse), --Owner, and --Size=Bytes.
With --Archives, a path to an archive file lists the archive's contents, and -S and --Tree recurse into archive files as if they were directories. Archive files in a listing appear as files, with their usual size, date, color and icon, so listing a directory without -S or --Tree prints the same output as without the switch.
tcdir --Archives release.zip: list the root of the archivetcdir --Archives release.zip\docs\*.md: list matching entries in a folder inside the archivetcdir --Archives -S src: recurse throughsrcand every archive in ittcdir --Archives --Tree src: draw each archive's contents below the archive's file line
| Format | Windows version |
|---|---|
.zip, .iso (ISO 9660, Joliet, UDF) |
All supported versions |
.7z, .rar, .tar, .tgz/.tar.gz, .tar.bz2, .tar.xz, .tar.zst, .cab, .cpio, .xar, .lzh |
Windows 11 23H2 and later (uses archiveint.dll, which ships with Windows) |
Archives are read-only: tcdir never changes them, never extracts them to disk, and never mounts .iso images. Only the archive's file list is read, so listing a large .zip is fast. Compressed tarballs and solid .7z/.rar archives must be decompressed to find their entries, so they take longer. On Windows 11 23H2 and later, an archive stored inside another archive (outer.zip\inner.zip) is browsed too: tcdir decompresses it into memory to read its file list. Inner archives larger than 256 MB, and all inner archives on earlier Windows versions, are listed as files. In tree view with a file mask, an archive that does not match the mask appears only when it contains matching entries. Owner, stream and cloud columns are blank for archive entries. A corrupt or password-protected archive prints an error, and the rest of the listing continues.
--Info prints a block of statistics for each archive instead of a listing. It works with or without --Archives.
tcdir --Info release.zip: report one archivetcdir --Info builds\*.zip: report every matching archive, followed by a summarytcdir --Info outer.zip\inner.7z: report an archive stored inside another archivetcdir --Info -S builds\*.7z: report matching archives inbuilds, its subfolders, and inside other archives at any depthtcdir --Info --Verify release.zip: also read every entry and check the checksums the archive stores
Every block lists the size on disk, the file, folder and nested-archive counts, the uncompressed size and ratio, the largest file, the deepest path, the date range, encryption, and a breakdown by extension. The blocks add these values for each format:
| Format | Details |
|---|---|
.zip |
Compression methods with compressed and uncompressed sizes, encryption type (ZipCrypto, AES), the creating host and version, ZIP64, several disks, a self-extractor prefix, and the comment |
.iso |
File systems (ISO 9660, Joliet, Rock Ridge, UDF revision), volume label and IDs, volume dates, sector count, and El Torito boot platforms |
| Others | Format and compression filters, stream totals, links, owners, groups, permissions, and entries with extended attributes or ACLs |
Listing switches (-W, -B, --Tree, -O, -A, -T, --Owner, --Streams, --Icons, --Size and the others that change listing output) can't be combined with --Info. Listing defaults in TCDIR or .tcdirconfig are ignored under --Info. --Verify requires Windows 11 23H2 or later. With --Verify, the run exits with a failure code when an entry is damaged.
Examples:
TCDir reads an optional config file at startup for persistent settings that don't require an environment variable.
Location:
- PowerShell:
$env:USERPROFILE\.tcdirconfig - CMD:
%USERPROFILE%\.tcdirconfig - Typically:
C:\Users\<you>\.tcdirconfig
The file uses the same Key=Value syntax as the TCDIR environment variable, with one setting per line. Comments start with #.
Example .tcdirconfig:
# Default switches
w
Owner
Icons
# Colors
.cpp=LightGreen
.h=LightGreen
.rs=LightRed
D=Cyan
# Icons
.py=Green,U+E606
# Tree defaults
Depth=3
TreeIndent=2
Size=AutoSupported settings: all the same keys as the TCDIR environment variable — switches, colors, icons, display attributes, Depth=N, TreeIndent=N, Size=Auto|Bytes.
Precedence (lowest to highest):
- Built-in defaults
- Config file (
.tcdirconfig) TCDIRenvironment variable- Command-line switches
Settings from higher-precedence sources override lower ones. Non-conflicting settings from all sources are merged.
Error handling: syntax errors in the config file are reported with line numbers via --Config. A missing config file is silently ignored. UTF-8 encoding is required (with or without BOM); UTF-16 is rejected with a diagnostic.
TCDir supports customizing colors (and default switch behavior) via the TCDIR environment variable.
The same syntax also works in the config file (one setting per line, without semicolons).
Syntax:
- PowerShell:
$env:TCDIR = "[<Switch>] | [<Item> | Attr:<fileattr> | <.ext>] = <Fore> [on <Back>][;...]" - CMD:
set TCDIR=[<Switch>] | [<Item> | Attr:<fileattr> | <.ext>] = <Fore> [on <Back>][;...]
Note: Switch names in the TCDIR variable do NOT include prefixes (/, -, --). Use just the switch name (e.g., W, Owner, Streams).
Enable default switches by including the switch name (in the TCDIR env var or .tcdirconfig):
W- enable wide listing by defaultS- enable subdirectory recursion by defaultP- enable performance timing by defaultM- enable multi-threading by default (already on by default)B- enable bare listing by defaultOwner- display file ownership by defaultStreams- display NTFS alternate data streams by defaultIcons- enable Nerd Font icons by default;Icons-to force offTree- enable tree view by default;Tree-to force offArchives- browse archive targets and recurse into archives by default;Archives-to force offDepth=N- set default tree depth limitTreeIndent=N- set default tree indent width (1–8)Size=Auto/Size=Bytes- set default size display format
Configure colors for display items, file attributes, and extensions:
Example:
- PowerShell:
$env:TCDIR = "W;D=LightGreen;S=Yellow;Attr:H=DarkGrey;.png=Black on Magenta" - CMD:
set TCDIR=W;D=LightGreen;S=Yellow;Attr:H=DarkGrey;.png=Black on Magenta
Decoded breakdown of the example:
Wsets the default switch/W(wide listing) onD=LightGreensets the Date display item color to LightGreenS=Yellowsets the Size display item color to YellowAttr:H=DarkGreysets the Hidden file attribute color to DarkGrey.png=Black on Magentasets the.pngextension color to black text on a magenta background
Display items for color configuration:
D(Date),S(Size),N(Name),Attr(Attributes)CloudOnly,Local,Pinned- cloud sync status symbol colors
Icon override (<.ext>=<Color>,U+<codepoint>):
- Override the icon glyph for any extension:
.rs=DarkRed,U+E7A8 - Color-only override (keep default glyph):
.js=Yellow - Glyph-only override (keep default color):
.md=,U+F48A
File attribute colors (Attr:<letter>):
-
H(hidden),S(system),R(read-only),D(directory) -
Here's an example of setting the TCDIR environment variable, then showing its effects:

To see the full list of supported colors and a nicely formatted explanation, use --Env.
To see config file help and the resolved .tcdirconfig path, use --Config:
To see your current resolved configuration (all sources merged), use --Settings:
- All configuration settings are displayed along with the source of each setting (default, config file, or env var).
- Config file parse errors are shown with file path and line number.
TCDir.exe --Settings:
- Visual Studio: open
TCDir.slnand Build Solution - VS Code: the repo includes
.vscode/(tasks/launch/settings), with tasks wired up toscripts/Build.ps1andscripts/RunTests.ps1 - Command line: use the PowerShell build scripts below
- Build:
pwsh -File .\scripts\Build.ps1 -Configuration <Debug|Release> -Platform <x64|ARM64> -Target Build - Clean:
pwsh -File .\scripts\Build.ps1 -Configuration <Debug|Release> -Platform <x64|ARM64> -Target Clean - Rebuild:
pwsh -File .\scripts\Build.ps1 -Configuration <Debug|Release> -Platform <x64|ARM64> -Target Rebuild - Build both Release targets:
pwsh -File .\scripts\Build.ps1 -Target BuildAllRelease
Build outputs land under:
x64\Debug\TCDir.exe,x64\Release\TCDir.exeARM64\Debug\TCDir.exe,ARM64\Release\TCDir.exe
Run unit tests:
pwsh -File .\scripts\RunTests.ps1
(Uses Visual Studio’s vstest.console.exe, discovered via vswhere.)
TCDir uses manual MAJOR.MINOR.PATCH semantic versioning, bumped by hand in TCDirCore/Version.h. Details are in BUILD_VERSION.md.
MIT License. See LICENSE.








