coreutils

uutils · uutils.coreutils

Cross-platform Rust rewrite of the GNU coreutils

winget install --id uutils.coreutils --exact --source winget

Latest 0.8.0

Release Notes

Rust Coreutils 0.8.0 Release: We are excited to announce the release of Rust Coreutils 0.8.0 — a major release featuring significant performance gains across core utilities, expanded WebAssembly (WASI) support with a brand-new online playground, and continued hardening against edge-case panics, /dev/full aborts and start of a large-scale migration from nix to rustix** for lower-level syscall safety!

GNU Test Suite Compatibility: ──────┬─────┬─────┬─────────────────────┬─────────────┬─────────────┬─────────────────────── Result│0.7.0│0.8.0│Change 0.7.0 to 0.8.0│% Total 0.7.0│% Total 0.8.0│% Change 0.7.0 to 0.8.0 ──────┼─────┼─────┼─────────────────────┼─────────────┼─────────────┼─────────────────────── Pass │629 │630 │+1 │94.59% │94.74% │+0.15% ──────┼─────┼─────┼─────────────────────┼─────────────┼─────────────┼─────────────────────── Skip │13 │14 │+1 │1.95% │2.11% │+0.16% ──────┼─────┼─────┼─────────────────────┼─────────────┼─────────────┼─────────────────────── Fail │23 │21 │-2 │3.46% │3.16% │-0.30% ──────┼─────┼─────┼─────────────────────┼─────────────┼─────────────┼─────────────────────── Error │0 │0 │0 │0% │0% │0% ──────┼─────┼─────┼─────────────────────┼─────────────┼─────────────┼─────────────────────── Total │665 │665 │0 │ │ │ ──────┴─────┴─────┴─────────────────────┴─────────────┴─────────────┴───────────────────────

Highlights:

  • GNU Compatibility & Upstream Collaboration
    • 630 passing GNU tests, with 2 fewer failures than 0.7.0
    • Continued contributing tests and bug reports upstream to GNU coreutils, strengthening both projects
    • Our compatibility work regularly uncovers edge cases in GNU itself, leading to fixes on both sides
  • nix → rustix Migration
    • Replaced nix crate with rustix across cat, df, wc, tty, tsort, tail, touch, date, mkdir, and uucore
    • Reduced range of unsafe code in hostname, logname, who, and nice
    • uucore: uses rustix for splice(), restricted to Linux
  • Performance Improvements
    • uucore: Share fluent resources between threads — dd perf +45%
    • uucore: Call rt_sigaction once instead of 62 times — faster startup
    • ls: Replace recursion with iterative depth-first search; remove many unnecessary allocations
    • sort: Performance improvements across sorting paths
    • wc: Improved -c performance with unextended pipe input (Linux)
    • cat: Avoid unnecessary pipe() when stdout is already a pipe; don't lock stdout before splice()
    • dd: Avoid zero-filling buffer at read_and_discard
    • tee: Increased buffer size for large input; removed Box and dyn overhead
    • numfmt: Protect name from argv[0] — +3% perf
    • pr: Avoid String conversion when storing lines to print
    • true/false/echo: Avoid uu_app().render_version() for smaller binary
  • WebAssembly (WASI) Support & Online Playground
    • New: Online Playground — try Rust Coreutils directly in your browser, powered by WebAssembly (blog post)
    • Added WASI support for 70+ utilities including ls, head, cat, cp, mv, sort, tail, and many more
    • Embedded all locales in the WASI binary
    • Added WASI platform stubs for FileInformation and IO module in uucore
    • Single-threaded sort path for WASI; disabled rayon on WASI
  • Platform Support
    • NetBSD: Multiple fixes, stdbuf support, expanded CI coverage
    • pathchk: Now builds for Windows
    • wc: Cross-platform building and 32-bit support
    • stdbuf: Fixed Cygwin cfg block; detect unsupported target at build time
    • uucore(fs): Made display_permissions_unix cross-platform
    • uucore: Support realtime signals (RTMIN/RTMAX) in signal_by_name_or_value
    • uucore: Permit D as decimal suffix modifier for GNU compatibility
  • Documentation & Manpages
    • Manpages now include TL;DR examples, links to the source code, and open bugs — see for example ls
    • Manpages are available in multiple languages including French and Spanish, refreshed daily
    • Added manpage linting in CI to catch formatting issues early
    • TL;DR attribution and disclaimer are now translatable
  • Contributions: This release was made possible by 13 new contributors joining our community

Call to Action: Try it in your browser — Online Playground powered by WebAssembly Help us translate — Contribute to Rust Coreutils on Weblate or TL;DR pages Sponsor us on GitHub to accelerate development: github.com/sponsors/uutils

What's Changed

cat

  • cat: Drop a clone() and use clap's default value by @oech3 in #11298
  • cat: replace nix with rustix by @oech3 in #11567
  • cat: avoid pipe() if stdout is pipe, extend pipe by @oech3 in #11551
  • cat: add bench for large size for splice by @oech3 in #11587
  • cat: add WASI stub for is_unsafe_overwrite and add to feat_wasm by @sylvestre in #11573
  • cat: fallback with pipe() failure by @oech3 in #11635
  • cat: don't lock stdout before splice() by @oech3 in #11643
  • cat: simplify splice & fix comment by @oech3 in #11627
  • cat: add bench by @oech3 in #11525
  • cat: remove some unnecessary to_owned() calls by @cakebaker in #11676

chown

  • chown(ref): parse_uid flattened syntax by @hlsxx in #11351
  • chown: warn when '.' is used as owner:group separator by @eyupcanakman in #11438

cksum

  • cksum family: #[allow(clippy::unwrap_used)] by @oech3 in #11307
  • cksum: add length support for shake128 and shake256 validation by @AldanTanneo in #11320
  • cksum: Bring back blake3 algorithm by @RenjiSann in #11316
  • cksum: rework blake length validation, add tests by @RenjiSann in #11437
  • cksum: Match GNU behavior for digest length errors in --check mode by @RenjiSann in #11499
  • *sum: protect names against argv[0] by @oech3 in #11375

coreutils

  • coreutils: --help >/dev/full panics by @oech3 in #11444
  • coreutils: --list arg and no args should fail by @oech3 in #11385
  • coreutils: Protect against env -a for security by @oech3 in #10773
  • coreutils: strip errno by @oech3 in #11484
  • yes, coreutils: backport(enable) 2 GnuTests by @oech3 in #11480

cp

  • clippy(cp): fix collapsible_if lint by @mattsu2020 in #11288
  • fix(cp): always create dest dirs with owner write bit before fixing permissions by @baa-ableton in #11318
  • wasm: add support for cp & mv by @sylvestre in #11572

cut

  • cut: Drop a clone() and use clap's default value by @oech3 in #11310
  • cut: improve some error messages by @cakebaker in #11338
  • cut: reject literal '' delimiter special-casing by @can1357 in #11399
  • cut: honor only-delimited in newline-delimiter mode by @can1357 in #11394
  • cut: use ? instead of match by @cakebaker in #11461

date

  • date: replace nix by rustix by @oech3 in #11646
  • date: fix "unused variable" warning by @cakebaker in #11637
  • date: fix date +%9223372036854775807c panic by @mattsu2020 in #11046
  • date: fix %#P case-swap on lowercase am/pm by @vishakha1411 in #11671
  • date: honor narrow width on wide default strftime fields by @vishakha1411 in #11670
  • date: apply locale-aware localization before GNU modifier processing by @sylvestre in #11661
  • date: add ignored tests for GNU compatibility gaps found by fuzz_date by @sylvestre in #11665

dd

  • dd: fix ISO-8859-1 case conversion for conv=lcase/ucase by @sylvestre in #10830
  • dd: catch OOM by @oech3 in #11562
  • dd: avoid 0-filling buf at read_and_discard by @oech3 in #11583
  • dd: do not show zero multiplier warning when zero is the multiplicand by @iburaky2 in #11673

df

  • df: replace unsafe libc sync with nix crate by @mattsu2020 in #11279
  • df: replace nix by rustix by @oech3 in #11576

env

  • env: fix --version and protect against argv[0] by @oech3 in #11370
  • env: Disallow ALL in --{ignore,default,block}-signal by @aweinstock314 in #11218

expand

  • clippy(expand): fix collapsible_if lint by @xtqqczze in #11286

expr

  • expr: fix eager evaluation of parenthesized dead branches by @can1357 in #11395

factor

  • factor: fix crash on malformed input by @Alonely0 in #11190
  • factor: deduplicate code, refactor & optimize parsing by @Alonely0 in #11292

head

  • head: reset stale partial line state on reused buffers by @can1357 in #11407
  • head: fix error message when input is a directory by @aguimaraes in #11541
  • head: split head.rs by @oech3 in #11679
  • feat_wasm: add head to the WASM-compatible utilities by @sylvestre in #11570

install

  • install: refactor conditional expression by @xtqqczze in #11280
  • install: rename unprivileged property by @cakebaker in #11283
  • clippy(install): fix collapsible_if lint by @xtqqczze in #11285
  • install: improve help texts by @cakebaker in #11290

ln

  • ln: Avoid dereferencing target if --no-dereference is passed by @aweinstock314 in #11253
  • ln: Restore backup to destination if linking fails by @aweinstock314 in #11355
  • ln: simplify the code by @sylvestre in #11390

ls

  • ls: replace recursion with depth-first search by @Alonely0 in #11386
  • ls: remove many unnecessary allocations by @Alonely0 in #11447
  • chore(ls): refactor codebase into new files by @Alonely0 in #11429
  • ls: add header to new files by @cakebaker in #11442
  • ls: Fix error message for ls file/missing-file by @oech3 in #11333
  • ls: fall back to "." metadata for ".." on WASI by @sylvestre in #11633
  • ls,dir,vdir: protect names against argv[0] by @oech3 in #11371
  • simplify the ls code by @sylvestre in #11391

mkdir

  • mkdir: replace libc and unsafe by rustix by @oech3 in #11647

nice

  • nice: Remove unsafe and reduce bin size by @oech3 in #11489

numfmt

  • numfmt: protect name from argv[0], perf +3% by @oech3 in #11379
  • numfmt: move duplicate code to function by @cakebaker in #11381
  • numfmt: implement the last changes by @sylvestre in #11411
  • numfmt: preserve fractional digits when --from-unit is used without suffix by @Eshwar1440 in #11674
  • numfmt: add failing test cases by @sylvestre in #11668
  • numfmt & others: Dedup some code by @sylvestre in #11645

od

  • od: default -t f to double precision by @can1357 in #11396

pr

Installer type: zip

Architecture Scope Download SHA256
x86 Download 2FFE88B9D81FAB6A1625A5F02737C8AB164741447403B92CB84377AC37E1BB39
x64 Download DB464CF2A6ECBFD42C85F46ED2D749BE574DF4DF47FECA1F08988FD760F324F3
arm64 Download 1DFA62F18B64C70B664936B06FB1BE20F0F6AFA9FF041DD95DDA629E987435A9

Details

Homepage
https://github.com/uutils/coreutils
License
MIT
Publisher
uutils
Support
https://github.com/uutils/coreutils/issues
Copyright
Copyright (c) uutils developers

Tags

busyboxcommand-line-toolcoreutilscross-platformgnu-coreutilsrust

Older versions (12)

0.7.0
Architecture Scope Download SHA256
x86 Download 1D0ACE9CE2FF51E2BB611F543EC6A4C887FB35B167B725815EDD0068711589F5
x64 Download DF878E29FC738BC4273E85C9D2C35AB898E31568021E6BAF1C330C7961943C8F
arm64 Download 372323492402F3249876599F1FF99AAD9BD2AECAA217B1CB146608EF58D3ED4B
0.6.0
Architecture Scope Download SHA256
x86 Download 4B95738775DE79250AF2CE4F1CA2ED88A31B37910B87B2B6F9F317755C9C1240
x64 Download F223058A51E8A2A4B92D9F1A1B2954F7A02B6D0F42E4A7E0413FCDB93BE2E287
arm64 Download 7183BD5AFF648B76517182E50D94819EFDAEDE637650F5B9AD9117C171C4EEBF
0.5.0
Architecture Scope Download SHA256
x86 Download 99C60F408F9B2BA243A6AE31E635CBC62A319573A103D56C154AE038479BA7E2
x64 Download BA0A319A2ACF0AB2C1786FB75A246090D905F49762638E903B4F8FF3195B72BE
arm64 Download 96538E06F0092B23CB0F368426FC2B1132F494CE7195CCC53E0FC8071436F73C
0.4.0
Architecture Scope Download SHA256
x86 Download 52FDA51612B67DA59B3D3E55988D38B8A7E3468950538AF410AAA2662AFF5DDF
x64 Download 3D22D9371118F3F6B2DBBC98D21CBFEE5D3A752732AF5B1EFB456C6410095CDA
arm64 Download 82B22FE1CA187D9AA136937AA52F2A485E40A98816F6FBECC6655199BF783198
0.3.0
Architecture Scope Download SHA256
x86 Download ADB01EA026C46FC1E2D6D998047D980B63ABF49B54F34DE7C5FC94FC7611DFEE
x64 Download BCB447C03BC8E15AE78A749586EDDF238F4C6D9576C1B4DE6B6077FA3BCE2A4F
arm64 Download E3DADC0AF59461B2DA53A7D9B70C930009183963CFBF34B0D3B9F5C5451F7F0A
0.2.2
Architecture Scope Download SHA256
x86 Download A68867D6E21BB6212C544797C1E268AF8C40D5DD1BC03DFD8DBA6D70868F8F9E
x64 Download 45922F4F43A7B4CC1191D52548201B244343CFB3C27E7761F34CE654E4CFB1B1
arm64 Download C248AC5C0F0DCA0971DFDA1042C3DB6B9E0D498D0666192922C51F358CCBFF4A
0.2.0
Architecture Scope Download SHA256
x86 Download 814234E3129A68532BC94249744EC4FBDA50E00FC9B47AE00CCF77D5BF2E4C5B
x64 Download 5B1B8D6E88B3ED8D3AF1CA7B180B3D99674751286E797F9735C367D680CFC634
arm64 Download ED282FBB5A500574050E2A0C9E668D8EA13A7BE4968625D2BB0E5A5758DCB08C
0.1.0
Architecture Scope Download SHA256
x86 Download 36EFC2D9295FFF72BAB4F8B87963A4EE8C0D83D008F145A273FAB967AA6D6AAE
x64 Download 4FF3C7E5149ADE20A342487D1C09CC6CC63599AF6DFB28D2558B925780A72D82
arm64 Download 9FAA0EC0F3DF47CAFA0A09FCEAD46DA28E2640B5FE1316AD9CB7E11F19050BD4
0.0.30
Architecture Scope Download SHA256
x86 Download 8CFE11CD0CD043099AB4598D943F786A0B5727677D5F418F8525481EA3D26F10
x64 Download 3931F570FF2665DB09B30614521712CC1D31426793E189A5DB704D2C40599BA9
arm64 Download 30FE9A3363F86EF43F286E2A403DBB5CEDBBDAF9FEB9946CF74DD14A5656AABB
0.0.28
Architecture Scope Download SHA256
arm64 Download 457BA14493BC2F843029B2A52CA7EA893DAD0A8A7F7359EF48329DFBE4057D6A
x86 Download A3ACE2B9111F7C6ADD567A251F772D181EADC95830AAD3BAB566BED48C3723C1
x64 Download 34FAF03E8550B523AC74668AD65FB12730930C636370F828580309A426BA93E2
0.0.27
Architecture Scope Download SHA256
x86 Download EE79D64937BEE34265D36DE7EE06A51FE8BC98AF635726A291310FD45F73B297
x64 Download 0C2E07FA1417E75687A05B9D577F67EEEDB5ECD0DC34BF40886E28E1E75BA15D
0.0.23
Architecture Scope Download SHA256
x86 Download 81A05CD58BBB7301B6F331AF0416173424533C97665671C2951124512A2145A8
x64 Download 6A09488F926F1462E6D80070473580B194534C3DD7E38E15DC6C4733DA46252E