Real Unix commands. Real Windows paths. One ~3 MB executable. No WSL Β· No Cygwin Β· No MSYS2 Β· No path-translation pain v1.0.0 stable is out. π
πΎ Install Β· β‘ Demo Β· π niubash Β· π¦ WPM Β· π Compare Β· π Docs Β· δΈζ
You're on Windows and you need grep -rn, sed -i, find -exec, xargs -0 β and every option so far is a compromise:
- WSL β 1 GB+ install, and a VM filesystem boundary between you and your files
- Cygwin β path-translation gymnastics and a 2β5 s startup
- GnuWin32 β abandoned in 2012, stuck at 60% compatibility
- uutils β a great Rust project, but ~100 commands and ~600 options
WinuxCmd skips the compromise. A single native Win32 executable that speaks GNU syntax on Windows paths: 169 commands, 1,855 options β with ongoing differential testing against GNU Coreutils 9.11 (43 cases, 35 pass, 8 known gaps tracked in issue-140).
| 169 | 1,855 | 43 cases | 2,346 | ~3 MB |
| commands | optionsΒΉ | GNU diff tests Β· 81% pass | tests Β· 99.6% pass | zero-dependency binary |
ΒΉ 1,855 =
OPTION(macro count insrc/commands/. Differential corpus: 43 cases across ~35 commands, 35 pass / 8 known gaps (issue-140). See the GNU comparison report.
# Every GNU flag you know, on real Windows paths
ls -la
grep -rn "TODO" src/
sed -i 's/http:/https:/g' config.ini
find . -name "*.tmp" -exec rm {} \;
# Full pipelines, zero setup β command links land on your PATH,
# so there are no prefixes and nothing to configure
find . -name "*.cpp" -print0 | xargs -0 wc -l
# And when a tool shouldn't be reimplemented, WPM installs the real thing
wpm install jq| Installer (recommended) | Grab WinuxCmd-<version>-x64-setup.exe (or the ARM64 setup) from GitHub Releases |
| Portable | Unzip WinuxCmd-<version>-win-x64.zip anywhere and add it to your PATH |
| Build from source | VS 2022 + CMake 3.30 + Ninja β see Building from source |
- πͺ Native, not emulated β talks to Win32 APIs directly. Understands
C:\, UNC paths and NTFS ACLs (withcygpathandgetfaclfor bridging). No VM, no runtime DLLs, instant startup. - π§ GNU where it counts β
findalone implements 88 options (full expression parser,-exec/-execdir/-ok,-printf);grepships PCRE2;sedsupports in-place-iediting. - π¦ WPM built in β a package manager for the tools that shouldn't be reimplemented: jq, ripgrep, fd, fzf, bat, make, neovim, curl, wgetβ¦
- π§ͺ Tested like it matters β 2,346 unit tests across 178 test files (99.6% pass), plus differential output testing against GNU Coreutils 9.11 (43 cases, 81% pass, 8 known gaps tracked in issue-140).
- β‘ Small and fast β ~3 MB, zero dependencies, instant startup (Cygwin takes 2β5 s just to boot).
WinuxCmd gives Windows real Unix commands. niubash gives them a real bash language to live in β the same unixwin org, two halves of one workflow:
# In niubash (native bash on Windows β no WSL):
for f in *.log; do
grep -c ERROR "$f" | xargs -I{} echo "$f: {} errors"
done | sort -t: -k2 -rn | head -5- Real bash semantics β
if/for/functions/arrays/pipelines run on niubash, powered by its rubash engine, green across the GNU Bash upstream test suite (86/86). - Agent-friendly β
niu -cis quiet and deterministic: no banners, stable stdout/stderr, exact exit codes. The shell your AI tooling already speaks. - Zero glue β niubash injects WinuxCmd's command links onto the
PATHat startup, sogrep,sedandfindabove are the real binaries you're looking at right now.
Ship WinuxCmd alone in a 3 MB exe, or drop in niubash (v1.0.0) and get the whole bash workflow.
wpm install jq # JSON processor
wpm install goawk # awk implementation
wpm install bsdtar # BSD tar
wpm install openssh # SSH client
wpm install make # GNU make
wpm install neovim # text editor
wpm install curl # URL transfer
wpm install wget # network downloader
wpm search json # discover packages
wpm list --all # see what's installedDetails in the WPM User Guide.
| Feature | WinuxCmd | uutils (Rust) | GnuWin32 | Cygwin | busybox |
|---|---|---|---|---|---|
| Commands | 169 | ~100 | ~90 | ~200 | ~300 |
| Options | 1,855 | ~600 | ~200 | Full | ~500 |
| GNU compat | 81% diff pass | 95% | 60% | 99% | 70% |
| Native Win32 | β | β | β | β | β |
| Package manager | β WPM | β | β | apt-cyg | β |
| Test cases | 2,346 | ~2,000 | 0 | β | ~100 |
| Binary size | ~3 MB | ~5 MB | β | 1 GB+ | β |
| Startup | Instant | Instant | β | 2β5 s | β |
| Maintained | β 2026 | β | β since 2012 | β | β |
Deep dive: vs uutils / GnuWin32 / Cygwin
| Aspect | WinuxCmd | uutils |
|---|---|---|
| Language | C++23 | Rust |
| Commands | 169 | ~100 |
| Options | 1,855 | ~600 |
| Binary size | ~3 MB | ~5 MB |
| Dependencies | None | Rust runtime |
| Build time | 2 min | 15 min |
| Package manager | WPM built-in | None |
| Aspect | WinuxCmd | GnuWin32 |
|---|---|---|
| Maintenance | Active | Abandoned |
| Last update | 2026 | 2012 |
| Windows support | Win10/11 | WinXP+ |
| Modern toolchain | C++23, CMake | C, autotools |
| Aspect | WinuxCmd | Cygwin |
|---|---|---|
| Install size | ~3 MB | 1 GB+ |
| Startup time | Instant | 2β5 s |
| Path handling | Native Windows | Unix emulation |
| Dependencies | None | MSYS2 runtime |
| Package manager | WPM | apt-cyg |
169 commands β full coverage table (click to expand)
| Category | Commands | Differential status |
|---|---|---|
| File Ops | cp, mv, rm, ln, install, mkdir, rmdir, touch, unlink | β mostly verified; cp has 9+ options rejected on Windows (issue-140) |
| Text Processing | cat, echo, head, tail, sort, uniq, cut, tr, wc, fold, fmt, join, comm | β diff PASS except fmt (OUT_DIFF, issue-140) |
| Directory Listing | ls, dir, vdir | β
ls PASS; dir Windows-columnar by design |
| Search | find, xargs | β |
| Crypto/Hash | base64, base32, basenc, md5sum, sha1sum, sha256sum, sha384sum, sha512sum, b2sum, cksum, sum | β |
| Date/Time | date, touch, time, timeout | β |
| System Info | uname, hostname, id, whoami, users, groups, nproc, uptime, arch | |
| Disk | df, du, stat | |
| Env/Expr | env, printenv, expr, seq, yes, true, false | β |
| Text Format | pr, nl, expand, unexpand, column, paste, tsort, ptx | |
| File Info | file, stat, readlink, realpath, dirname, basename, pathchk, sync | |
| Process | nice, nohup, stdbuf | |
| Permissions | chmod, chown, chgrp, chroot | |
| Other | shred, factor, kill, truncate, fmt, numfmt, mktemp, dircolors, sum, csplit, split |
| Command | Options | Features |
|---|---|---|
| find | 88 | Full expression parser, -exec/-execdir/-ok, -printf |
| grep | 49 | PCRE2 support, --color, --exclude patterns |
| sed | 17 | In-place editing, extended regex, --posix |
cal, column, hexdump, logger, tree, less, more, strings, rev, tsort, seq, sleep, nohup, watch, tput
ps, top, kill, killall, pgrep, pkill, pidof, pldd, free, uptime, renice, stdbuf, timeout
cygpath, dos2unix, unix2dos, d2u, u2d
hostname, id, who, pinky, stty, infocmp, tic, toe, locale, tput, getconf, getfacl, ldd, lsof, file, man
wpm (package manager), mpicalc, regtool, mkpasswd, mkgroup, mkfifo, mknod, clear, reset, tzset
| Test | WinuxCmd | uutils | GNU (WSL2) |
|---|---|---|---|
| cat (100 MB) | 0.8 s | 0.9 s | 0.7 s |
| sort (1M lines) | 2.1 s | 2.3 s | 1.9 s |
| grep (100 MB) | 1.2 s | 1.1 s | 1.0 s |
| find (10K files) | 0.3 s | 0.4 s | 0.2 s |
Consistently in the same league as uutils β and within ~10β15% of native GNU running under WSL2, without booting a VM.
Benchmark environment: Windows 11, Intel i7-13700K, 32 GB RAM, NVMe SSD
- 2,346 automated test cases across 178 test files β 99.6% pass rate
- Differential corpus: 99 test cases (3 corpus + 43 regressions + 53 expansion cases, covering 71 commands), executed against GNU Coreutils 9.4 (WSL2) with identical inputs β 95 pass / 4 whitelisted platform-environment differences, verified on the current build (2026-09)
- Automated GNU comparison:
scripts/compare_outputs.shandgnu_comparison_tests.sh; per-case runner:tests/differential/runner.sh
| Whitelisted | Command | Reason |
|---|---|---|
| 21 | id -g |
platform: Windows has no POSIX gid; prints primary-group RID (197121) |
| 23 | cp -l |
environment: hardlinks across \\wsl.localhost 9p unsupported in the WSL-side runner; verified on native NTFS |
| 35 | ln -hard |
environment: same 9p hardlink limitation as cp -l |
| 30 | mkdir exists |
format: GNU uses locale-dependent curly quotes (U+2018/2019); winuxcmd uses ASCII ' |
The eight former issue-140 gaps (dd, diff -u, tsort, fmt, stat, sdiff, ptx, stdbuf) all pass; normal-format diff hunk-header, hash-family separator, cksum line-ending, realpath forward-slash, and od -c octal-escaping gaps were all found and fixed in 2026-09.
See the GNU Comparison Report.
| Document | Description |
|---|---|
| Compatibility Matrix | Support status of all 169 commands |
| GNU Comparison Report | Differential testing vs GNU Coreutils 9.4 |
| Windows Features | Windows-specific behavior |
| WPM Guide | Package manager user guide |
| GNU Test Baseline | GNU test framework |
Prerequisites: Visual Studio 2022+ Β· CMake 3.30+ Β· Ninja
# Build
./scripts/build-with-vs.ps1
# Run tests
./scripts/build-with-vs.ps1 -Target winuxcmd-tests
build-vs/tests/winuxcmd-tests.exeContributions welcome β see CONTRIBUTING.md.
MIT β see LICENSE.
WinuxCmd β because ls shouldn't require a Linux kernel.
Pair it with niubash β the native bash shell that speaks GNU fluently on Windows.