microsoft/coreutils
Rust
Captured source
source ↗microsoft/coreutils
Description: Coreutils for Windows: Installer & Packaging
Language: Rust
License: MIT
Stars: 3854
Forks: 62
Open issues: 54
Created: 2026-05-15T05:42:32Z
Pushed: 2026-06-10T22:19:30Z
Default branch: main
Fork: no
Archived: no
README: Coreutils for Windows
UNIX-style core utilities for Windows. The same commands and pipelines you use on Linux, macOS, and WSL - natively.
Install · Shell conflicts · Windows caveats · Contributing
---
A Microsoft-maintained build of uutils/coreutils, findutils, and grep packaged as a single multi-call binary for Windows. The goal is to make moving between Linux, macOS, WSL, containers, and Windows frictionless: the same commands, flags, and pipelines work the same way, so existing scripts carry over without translation.
Each command supports the standard --help flag for full syntax and options.
This project is in preview.
Install
Install Coreutils for Windows with WinGet:
winget install Microsoft.Coreutils
Or grab the latest build from our Release Page.
Creating custom alias
- PowerShell: Set-Alias ll 'ls' or a function in your $PROFILE for arguments, e.g.
function ll { ls -la --color=auto @args } - CMD: doskey ll=ls -la $*
> [!WARNING] > Using PowerShell aliases will cause binary stream compatibility. Some utilities will not work when piped (e.g. xargs, find, ...)
Shell conflicts
> [!NOTE] > Any command not mentioned is included in this suite. The following only lists conflicts.
> [!WARNING] > PowerShell 7.4 or later is required. > PowerShell 7.6 or later is recommended for ~ support.
Several commands share names with built-ins in CMD and PowerShell. Whether the Coreutils version runs depends on the shell, the PATH order, and (for PowerShell) the alias table.
Legend: ✅ ships and works · ⚠️ ships but conflicts with a built-in · 🛑 not shipped
| Command | CMD | PowerShell 7.4+ | Notes | | ---------- | :--: | :-------------: | ----- | | cat | ✅ | ⚠️ | | | cp | ✅ | ⚠️ | | | date | ⚠️ | ⚠️ | | | dir | 🛑 | 🛑 | Conflicts with the built-in DOS command | | echo | ⚠️ | ⚠️ | | | expand | 🛑 | 🛑 | Conflicts with the built-in DOS command | | find | ✅ | ✅ | Integrated port of the original DOS command | | hostname | ✅ | ✅ | Superset of the Windows built-in | | kill | 🛑 | 🛑 | Unavailable due to lack of signals on Windows; Implementing a form of SIGTERM/SIGKILL may be possible in the future however | | ls | ✅ | ⚠️ | | | mkdir | ⚠️ | ⚠️ | | | more | 🛑 | 🛑 | Conflicts with the built-in DOS command (consider edit as an alternative) | | mv | ✅ | ⚠️ | | | pwd | ✅ | ⚠️ | | | rm | ✅ | ⚠️ | | | rmdir | ⚠️ | ⚠️ | | | sleep | ✅ | ⚠️ | | | sort | ✅ | ⚠️ | Integrated port of the original DOS command | | tee | ✅ | ⚠️ | | | timeout | 🛑 | 🛑 | Relies on kill's functionality | | uptime | ✅ | ⚠️ | | | whoami | 🛑 | 🛑 | Conflicts with the built-in Windows command |
Windows caveats
| Difference | Detail | | --------------------- | ------ | | CRLF line endings | Windows text files often use CRLF (\r\n). Most utilities handle this transparently, but byte-oriented behavior can still observe the \r; for example, uniq may treat the final line as different from a preceding duplicate if the input uses CRLF and the final line has no trailing newline. | | No `/dev/null` | Use NUL instead, for example find . -name "*.log" > NUL | | No POSIX signals | Signals such as SIGHUP, SIGPIPE, and SIGUSR aren't available. Ctrl+C (SIGINT) works as expected. | | Path separators | Both / and \ are accepted. Some utilities produce \-separated output, which can affect downstream piping. | | File permissions | Windows uses ACLs, not POSIX permission bits. Permission-based predicates (for example find -perm) may behave differently or be unavailable. | | Symbolic links | Reading existing symbolic links works without elevation. Creating new symbolic links requires Developer Mode (**Settings > System > Advanced**) or an elevated terminal. |
PowerShell Command Parsing
The installer integrates itself with interactive PowerShell sessions via PSReadLine. It ensures that quoted expression behave somewhat like they do under UNIX shells or CMD: echo *.txt will then print a number of file names, while echo '*.txt' will print "*.txt" literally.
There are two shortcomings, however:
- PowerShell's escape character is still \`, not \\
While you may write find . \( -foo -bar \) with Bash, you still need to write `find . ( -foo -bar )` in PowerShell.
Get-Command ls,Get-Help ls, etc., will still showls, etc., as builtin commands
Due to limitations around PSNativeCommandPreserveBytePipe we cannot integrate ourselves in a more robust way with PowerShell.
Intentionally dropped
Commands that exist upstream but aren't shipped here because they rely on POSIX-only concepts, would break existing Windows scripts, or simply aren't useful on Windows.
dd: Perhaps useful in the future.dircolors,shred,sync,uname: Not particularly useful on Windows.chcon,chgrp,chmod,chown,chroot,groups,hostid,id,install,
logname, mkfifo, mknod, nice, nohup, pinky, runcon, stdbuf, stty, tty, users, who: POSIX-only concepts unavailable on Windows.
Contributing
Bug reports and pull requests are welcome. See [CONTRIBUTING.md](./CONTRIBUTING.md) for details on the repo layout and how changes flow between this repo and the upstream uutils projects.
Notability
notability 7.0/10Major Rust coreutils release, strong HN and GitHub traction