The problem, in one sentence
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: 176 commands, 1,924 options β with ongoing differential testing against a GNU coreutils 9.7 oracle (178 cases, 165 pass, 13 tracked platform diffs).
| | | | |
|---|
| 176 | 1,924 | 178 cases | 2,420 | ~4 MB |
| commands | optionsΒΉ | GNU diff Β· 93% pass | unit tests Β· 99.6% pass | single binary |
> ΒΉ 1,924 = OPTION( macro count in src/commands/. Command count excludes the internal wpm manager and the [ bracket alias of test. Differential corpus: 178 cases across 84 commands (165 pass / 13 known platform diffs, tests/differential/baseline.json). See the GNU comparison report.
β‘ Unix muscle memory on Windows
# 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
πΎ Install
| |
|---|
| Installer (recommended) | Grab WinuxCmd--x64-setup.exe (or the ARM64 setup) from GitHub Releases |
| Portable | Unzip WinuxCmd--win-x64.zip anywhere and add it to your PATH |
| Build from source | VS 2022 + CMake 3.30 + Ninja β see Building from source |
π Why WinuxCmd
- πͺ Native, not emulated β talks to Win32 APIs directly. Understands
C:\, UNC paths and NTFS ACLs (with cygpath and getfacl for bridging). No VM, no runtime DLLs, instant startup.
- π§ GNU where it counts β
find alone implements 88 options (full expression parser, -exec/-execdir/-ok, -printf); grep ships PCRE2; sed supports in-place -i editing.
- π¦ 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,420 unit tests (99.6% pass), plus 178 differential output cases against a GNU coreutils 9.7 oracle (165 pass / 13 tracked platform diffs, 93%).
- β‘ Small and fast β ~3 MB, zero dependencies, instant startup (Cygwin takes 2β5 s just to boot).
π Better together: the niubash shell
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 -c is 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
PATH at startup, so grep, sed and find above 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 package manager
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 installed
Details in the WPM User Guide.
π How it compares
| Feature | WinuxCmd | uutils (Rust) | GnuWin32 | Cygwin | busybox |
|---|
| Commands | 176 | ~100 | ~90 | ~200 | ~300 |
| Options | 1,924 | ~600 | ~200 | Full | ~500 |
| GNU compat | 81% diff pass | 95% | 60% | 99% | 70% |
| Native Win32 | β
| β | β
| β | β |
| Package manager | β
WPM | β | β | apt-cyg | β |
| Test cases | 2,420 | ~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
vs uutils/coreutils (Rust)
| Aspect | WinuxCmd | uutils |
|---|
| Language | C++23 | Rust |
| Commands | 176 | ~100 |
| Options | 1,924 | ~600 |
| Binary size | ~3 MB | ~5 MB |
| Dependencies | None | Rust runtime |
| Build time | 2 min | 15 min |
| Package manager | WPM built-in | None |
vs GnuWin32
| Aspect | WinuxCmd | GnuWin32 |
|---|
| Maintenance | Active | Abandoned |
| Last update | 2026 | 2012 |
| Windows support | Win10/11 | WinXP+ |
| Modern toolchain | C++23, CMake | C, autotools |
vs Cygwin
| 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 |
π§° Command coverage
176 commands β full coverage table (click to expand)
GNU Coreutils (83 commands)
| 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 | β οΈ whoami/users/groups thin stubs (β€1 declared option each) |
| Disk | df, du, stat | β οΈ stat deep-path gap (OUT_DIFF, issue-140) |
| Env/Expr | env, printenv, expr, seq, yes, true, false | β
|
| Text Format | pr, nl, expand, unexpand, column, paste, tsort, ptx | β οΈ tsort and ptx output-format gaps (OUT_DIFF, issue-140) |
| File Info | file, stat, readlink, realpath, dirname, basename, pathchk, sync | β οΈ stat deep-path; file no-magic stub |
| Process | nice, nohup, stdbuf | β οΈ nice thin (1 option); stdbuf EXIT_DIFF (issue-140) |
| Permissions | chmod, chown, chgrp, chroot | β οΈ Linux ownership/SELinux options rejected on Windows |
| Other | shred, factor, kill, truncate, fmt, numfmt, mktemp, dircolors, sum, csplit, split | β οΈ fmt OUT_DIFF gap |
GNU findutils/grep/sed (3 commands)
| 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 |
BSD tools (15 commands)
cal, column, hexdump, logger, tree, less, more, strings, rev, tsort, seq, sleep, nohup, watch, tput
Process management (13 commands)
ps, top, kill, killall, pgrep, pkill, pidof, pldd, free, uptime, renice, stdbuf, timeout
Cygwin/MSYS2 (14 commands)
cygpath, dos2unix, unix2dos, d2u, u2d
System info (16 commands)
hostname, id, who, pinky, stty, infocmp, tic, toe, locale, tput, getconf, getfacl, ldd, lsof, file, man
Custom extensions (10+ commands)
wpm (package manager), mpicalc, regtool, mkpasswd, mkgroup, mkfifo, mknod, clear, reset, tzset
π Benchmarks
| 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
π§ͺ Testing and GNU verification
- 2,420 automated unit tests β 99.6% pass rate
- Differential corpus: 178 test cases (131 corpus + 47 regressions, covering 84 commands), executed against a GNU coreutils 9.7 oracle with identical inputs β 165 pass / 13 tracked diffs (93%), machine-checked in
tests/differential/baseline.json
- Automated GNU comparison:
scripts/compare_outputs.sh and gnu_comparison_tests.sh; per-case runner: tests/differential/runner.sh
| Tracked diffs (13) | Command / case | Reason |
|---|
id -g | regressions/21-id-group | platform: Windows has no POSIX gid; prints primary-group RID (197121) |
cp -l, ln | regressions/23-cp-link-option, ln/35-hard | environment: hardlinks across \\wsl.localhost 9p unsupported in the WSL-side runner; verified on native NTFS |
mkdir exists | mkdir/30-exists | format: GNU uses locale-dependent curly quotes (U+2018/2019); winuxcmd uses ASCII ' |
| dd, envsubst, mktemp, namei, readlink, which, seq | 9 remaining cases | output-format/platform differences; per-case state lives in tests/differential/baseline.json |
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.
π Documentation
π οΈ Building from source
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.exe
π€ Contributing
Contributions welcome β see CONTRIBUTING.md.
License
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.
β¬ Back to top