Microsoft Coreutils for Windows: UNIX Commands Without WSL
Coreutils for Windows: Installer & Packaging
At a glance
- What is it?
- Coreutils for Windows packages uutils coreutils, findutils and grep into one multi-call binary installed through WinGet. It is a preview, and the shell conflicts table is the part most people will underestimate.
- Who is it for?
- Adopt it if you write cross-platform scripts and want the same flags on Windows without opening WSL, and if your team already runs PowerShell 7.4 or later. Skip it if your scripts depend on POSIX signals, chmod and chown semantics, or the commands the project intentionally drops, including dd, kill and whoami.
- Can I use it commercially?
- Yes. MIT is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
- Is it still maintained?
- Yes. The repository last received commits 3 days ago.
- What is it written in?
- Mainly Rust, according to GitHub's language statistics.
Answers come from the project's GitHub data, last synced on September 17, 2026, and from our analysis. They are not legal advice.
DEEP OPEN-SOURCE ANALYSIS
What Coreutils for Windows Is and Who Needs It
The README describes the project as a Microsoft-maintained build of uutils/coreutils, findutils and grep, packaged as a single multi-call binary for Windows. The stated goal is narrow and practical: the same commands, flags and pipelines work the same way across Linux, macOS, WSL, containers and Windows, so existing scripts carry over without translation.
The audience is anyone who maintains shell scripts that have to run in more than one place. If you have a build script that calls find with -name and -type, or a pipeline that leans on sort, uniq and tee, this replaces the usual workaround of rewriting the script for PowerShell or routing everything through WSL. The README frames the motivation as removing friction when moving between environments, and that framing matches the design: the binary is a port of GNU-compatible tools rather than a new command language.
It is not a GNU coreutils distribution on Windows. It is a Rust implementation, upstream at uutils, with Microsoft doing the packaging, the installer and the Windows-specific integration. That distinction matters when you compare behavior against a Linux box, because the underlying implementations are separate codebases with separate bug histories. The README also states plainly that the project is in preview, which is the first thing to weigh against any deployment plan.
How the Multi-Call Binary and Installer Fit Together
The repository layout shows two distinct pieces. The Rust crate in Cargo.toml is named coreutils and pulls command implementations from deps/coreutils as separate packages: base32, base64, basename, basenc and so on, each aliased to a uu_* package name. A patch section redirects uucore and uucore_procs to the vendored copies under deps/coreutils/src. Alongside the crate sit build.ps1, build.rs and coreutils.iss, the Inno Setup script, which is the packaging side of the repository.
The command set is deliberately trimmed. The Cargo.toml comments list what was removed from the upstream common core and why: dd, dir, dircolors, expand, more, shred and vdir. The README explains the removals in three buckets. Some commands conflict with built-in DOS commands, which covers dir, expand and more. Some rely on POSIX-only concepts, which covers the long list including chmod, chown, chroot, mkfifo, mknod and nice. And some are judged simply not useful on Windows, which covers dircolors, shred, sync and uname.
The release profile is worth a look for anyone packaging Rust for Windows. The Cargo.toml sets lto, opt-level = "s", panic = "abort", strip = "symbols" and split-debuginfo = "packed", with comments attributing size reductions to each. That is a distribution-oriented build, not a developer-oriented one, and it is consistent with shipping a single binary that contains many commands.
Installing Coreutils for Windows with WinGet
The README gives one install path: WinGet. Run it from PowerShell or CMD.
winget install Microsoft.CoreutilsIf WinGet is not available in your environment, the README points to the release page as the alternative source for the latest build. There is no documented MSI, Chocolatey or Scoop path.
After installation, the project provides a management command. The README notes you can remove individual utilities with coreutils-manager disable followed by the utility name, and directs you to coreutils-manager --help for the other management subcommands. That is the tool to reach for when a shipped command collides with something you already rely on.
A first real use is the pipeline you would write on Linux. The README's own example for the NUL device shows the substitution you need on Windows:
find . -name "*.log" > NULOn a UNIX system that would be /dev/null, which does not exist here. Every command supports --help for full syntax and options, so coreutils-manager --help and find --help are the two places to start when you want to confirm what this build actually accepts before you port a script.
Shell Conflicts Are the Real Adoption Cost
The README's conflict table is the most important page for anyone evaluating this. It marks each command as shipping and working, shipping but conflicting with a built-in, or not shipped, separately for CMD and PowerShell 7.4 and later.
In CMD, cat, cp, find, hostname, ls, mv, pwd, rm, sleep, sort, tee and uptime work. date, echo, mkdir and rmdir ship but collide with built-ins. dir, expand, kill, more, timeout and whoami are not shipped at all. The README gives reasons: dir, expand and more conflict with DOS commands, kill is unavailable because Windows lacks signals, timeout depends on kill's functionality, and whoami conflicts with the built-in Windows command. It also notes that implementing some form of SIGTERM or SIGKILL may be possible in the future, which is a statement about intent, not a current capability.
PowerShell is worse because of the alias table. The same commands that work in CMD mostly show as conflicting under PowerShell 7.4 and later, and the README says whether the Coreutils version runs depends on the shell, the PATH order and the alias table. The table also sets a floor: PowerShell 7.4 or later is required, and 7.6 or later is recommended for ~ support. If your fleet is on Windows PowerShell 5.1, this project is not for you yet.
The alias advice carries its own warning. The README states that using PowerShell aliases will cause binary stream compatibility problems, and that some utilities will not work when piped, naming xargs and find as examples. So the convenient Set-Alias ll 'ls' shortcut can break the exact pipelines you installed the suite for. The README's suggested function form, function ll { ls -la --color=auto @args }, is safer, but the warning still applies to the aliasing approach in general.
PowerShell Parsing, CRLF and Other Windows Caveats
The installer integrates with interactive PowerShell sessions through PSReadLine, so quoted expressions behave more like UNIX shells or CMD: echo *.txt prints file names, while echo '*.txt' prints the literal string. Two limitations are documented. PowerShell's escape character remains the backtick rather than the backslash, so a parenthesized find expression written as find . \( -foo -bar \) in Bash needs backticks in PowerShell. And the integration rewrites interactive input but does not remove PowerShell's aliases, so Get-Command ls and Get-Help ls still report ls as a built-in or alias. The README attributes this to limitations around PSNativeCommandPreserveBytePipe.
The caveat table lists five more differences. CRLF line endings are mostly handled transparently, but byte-oriented behavior can still see the \r; the README's example is that uniq may treat the final line as different from a preceding duplicate when the input uses CRLF and the final line has no trailing newline. There is no /dev/null, so use NUL. POSIX signals such as SIGHUP, SIGPIPE and SIGUSR are unavailable, though Ctrl+C works. Both / and \ are accepted as path separators, but some utilities emit \-separated output, which can affect downstream piping. Permissions are ACLs rather than POSIX bits, so predicates such as find -perm may behave differently or be unavailable. Reading existing symbolic links needs no elevation, but creating new ones requires Developer Mode or an elevated terminal.
That last item is the one that quietly breaks CI. A script that creates symlinks will fail on a default Windows runner unless Developer Mode is enabled or the process is elevated, and the README documents no workaround beyond those two options.
When Coreutils for Windows Is the Wrong Tool
The intentionally dropped list is the clearest boundary. If your scripts call dd, chmod, chown, chroot, mkfifo, mknod, nice, nohup, stdbuf, stty, tty or who, this suite does not provide them, and the README gives the reason: they depend on POSIX-only concepts unavailable on Windows. chmod in particular is hard to work around, because ACLs are not a drop-in replacement for permission bits and the README does not offer a mapping.
Signal-dependent behavior is the second boundary. kill and timeout are absent, and SIGHUP, SIGPIPE and SIGUSR are unavailable. A script that relies on SIGPIPE to terminate a producer when a consumer exits early has no equivalent here, and the README does not describe a substitute. Ctrl+C working is not the same thing.
The preview status is the third. The README states the project is in preview, and the release history shows the shape of that: the first release of Coreutils for Windows came in June 2026, followed by servicing releases. A servicing release cadence suggests fixes rather than a frozen interface, so anything you build on top should be pinned to a version and retested on upgrade.
Finally, if your goal is simply to run UNIX tools on Windows, WSL already solves that with the real GNU implementations and no conflict table. This project is for people who specifically need native Windows execution, not for people who want a Linux environment.
How It Compares with BusyBox and WSL
The most common comparison is BusyBox. Both ship many utilities behind a single multi-call binary, and both trim the command set. The difference is the target: BusyBox is built for embedded systems and minimal environments, with a reduced feature set per command and its own option parsing conventions. Coreutils for Windows ports uutils, which aims at GNU-compatible flags, and the README's premise is that existing scripts carry over without translation. If your script uses a GNU-specific flag, the uutils lineage is the closer match; if you want the smallest possible binary for a constrained environment, BusyBox is the more established choice.
Against WSL the trade-off is different. WSL gives you a Linux kernel and the real GNU tools, so chmod, signals and /dev/null all work as documented on Linux. Coreutils for Windows gives you native Windows processes, no virtual machine, and direct access to Windows paths and tooling, at the cost of the caveats above. The README's own framing puts WSL in the list of environments the project wants to move between, not replace.
Against PowerShell's own built-ins, the case is script portability rather than capability. PowerShell has equivalents for many of these tasks, but they are different commands with different flags. If your team already writes idiomatic PowerShell, adding a second vocabulary for the same operations is a net cost.
Licence, Maintenance and Upgrade Cost
The repository is MIT licensed, and Cargo.toml carries license = "MIT" for the crate. The repository also contains a NOTICE.md file, which is where attribution for bundled or vendored components typically lives. Because this project vendors upstream uutils, findutils and grep code under deps/, anyone redistributing a build should read NOTICE.md and the upstream licences rather than assuming the top-level MIT file covers everything. That is a packaging question for legal review, not something to resolve from the README alone.
Maintenance signals are straightforward. The repository is not archived, and the last push was on 2026-09-14, three days before this writing, so the codebase is being worked on now. The release history shows v2026.5.29 as the first release of Coreutils for Windows, followed by v2026.6.16 and v2026.9.3, both labelled servicing releases. The version in Cargo.toml matches the latest release, 2026.9.3.
Upgrade cost is the part to plan for. The README documents coreutils-manager for disabling individual utilities, which implies the installed set is mutable and that a conflict introduced by a new release can be turned off without uninstalling the suite. What the README does not document is rollback, version pinning through WinGet, or a changelog per servicing release. If you deploy this across a fleet, capture the version you validated and confirm the upgrade path before you let WinGet update it unattended.
Editorial conclusion
Adopt it if you write cross-platform scripts and want the same flags on Windows without opening WSL, and if your team already runs PowerShell 7.4 or later. Skip it if your scripts depend on POSIX signals, chmod and chown semantics, or the commands the project intentionally drops, including dd, kill and whoami. Before rolling it out, check the conflict table for the commands you call most, and run coreutils-manager disable on whichever built-in shadows are causing trouble in your sessions.
Frequently asked questions
How do I install Coreutils for Windows?
The README gives one command: winget install Microsoft.Coreutils. If WinGet is unavailable, the release page is the documented alternative source.
How do I use Coreutils on Windows?
Install it, then call the commands as you would on Linux. Each command supports --help for full syntax and options, and coreutils-manager --help lists the management subcommands.
What are the differences between uutils and coreutils?
Coreutils for Windows is a Microsoft-maintained build of uutils/coreutils, findutils and grep, packaged as a single multi-call binary. The implementations live upstream in the uutils projects and are vendored into this repository under deps/.
What are the key differences between BusyBox and coreutils?
Both ship many utilities in one multi-call binary. BusyBox targets embedded and minimal environments with a reduced feature set, while this project ports uutils, which aims at GNU-compatible flags so existing scripts carry over.
How do I install Microsoft Coreutils?
The same way: winget install Microsoft.Coreutils, or a build from the release page if WinGet is not available in your environment.
What is coreutils for Windows?
It is a Microsoft-maintained build of uutils/coreutils, findutils and grep packaged as a single multi-call binary for Windows, in preview, so the same commands and pipelines work as on Linux, macOS and WSL.
Community notes