近一點看 Windows UNIX 工具包 - Coreutils for Windows
| | | 5 | |
幾天前,微軟發佈了 Coreutils for Windows 工具包 - 由微軟維護的 UNIX 風格命令列工具,讓你在 CMD 或 PowerShell 裡也能使用 cat、grep、find 等這些在 Linux/macOS/WSL 常用的方便工具。
最簡單安裝方式是使用 winget:winget install Microsoft.Coreutils,裝完記得重啟 CMD/PowerShell 讓路徑設定生效,武器就上膛了。

官方文件有一份完整指令清單,用 Linux 跑 Docker 已快十年,有一點 UNIX CLI 指令經驗,而趁此機會我花了些時間將清單巡過一輪,看看有沒有我遺漏的好工具。而指令名稱前面加 * 是我個人愛用或 Windows 原本沒有的實用好物,可多留意。至於使用方法,指令連結有官方說明,但文件簡略偏硬不太好懂,我們早被 AI 寵壞了,若看不明白建議可改問 AI 尋求溫暖。
arch顯示當前系統的硬體架構,例如 x86_64b2sum計算或檢查 BLAKE2b 雜湊碼,比傳統的 MD5 更安全且快速base32使用 base32 編碼或解碼資料,列印到標準輸出base64⭐ 使用 base64 編碼或解碼資料,列印到標準輸出
D:\>echo "Hello World" | base64
IkhlbGxvIFdvcmxkIiANCg==
basename⭐ 去除路徑中的目錄部分,僅顯示最後的檔案名稱basenc支援多種編碼方式如 Base64、Base32、Hex 等的統一編碼與解碼工具cat連接檔案並顯示在標準輸出上,常用於查看純文字檔內容cksum⭐ 計算檔案的 CRC 校驗碼與位元組長度comm逐行比較兩個已排序的檔案,顯示兩者獨有或共有的行cp複製檔案或整個目錄到指定的目的地csplit根據指定的內容模式或行號,將一個檔案分割成數個部分cut從每一行輸入中根據欄位、字元或位元組位置擷取特定部分date顯示或設定系統的日期與目前時間df⭐ 顯示磁碟檔案系統的使用情況,包括已用與剩餘空間 (截圖在 du 處)dirname去除路徑中的檔案名稱部分,僅顯示目錄路徑du⭐ 估計並顯示檔案或目錄所佔用的磁碟空間大小

echo在螢幕上顯示一行指定的文字或環境變數值env顯示當前的環境變數expr計算並輸出運算式的值,支援數學運算、字串處理與邏輯判斷factor分解質因數,輸出指定整數的所有質數因子false不執行任何動作並直接結束,回傳代表「失敗」的狀態碼 1find⭐ 在目錄層級結構中搜尋符合特定條件的檔案或目錄fmt重新編排段落文字,使其符合指定的行寬(預設 75 字元)以利閱讀fold將輸入的每一行文字按照指定的寬度進行強制折行grep⭐ 超強文字搜尋工具,可用正規表達式過濾並顯示符合模式的文字行head⭐ 顯示檔案的開頭部分,預設輸出前 10 行hostname顯示或設定系統主機名稱join根據共同的欄位,合併兩個檔案內容la列出目錄內容,包括隱藏項目(等同ls -A)link呼叫系統功能建立一個指向現有檔案的硬連結 (Hardlink)ln建立檔案之間的連結,支援硬連結 (Hard Link) 與符號連結 (Symbolic Link)ls列出目錄中的檔案與子目錄清單,並可顯示詳細屬性md5sum⭐ 計算或檢查 MD5 雜湊值,用於驗證檔案完整性mkdir建立一個或多個新的目錄mktemp建立一個暫存檔案或目錄mv移動檔案或目錄,也可用來重新命名nl讀取檔案並為每一行加上行號後輸出nproc列印目前處理器可用核心數numfmt⭐ 將數字轉換為易讀字串 (如 K、M、G) 或進行反向轉換od以八進位或其他格式(如十六進位、ASCII)傾印檔案內容pathchk檢查檔案路徑名稱在當前或不同系統平台下是否有效且具備可移植性pr將檔案分頁或分欄排版,以便進行列印作業printenv顯示指定環境變數的值printf根據格式化字串與參數輸出內容,比 echo 更精確彈性ptx為檔案產生排列索引(Permuted Index)pwd顯示目前所在工作目錄的完整路徑名稱readlink顯示符號連結所指向的原始檔案路徑或規範化路徑realpath解析並顯示檔案的絕對路徑,並處理所有的符號連結rm刪除指定的檔案或目錄或解除連結rmdir刪除空的目錄;若目錄內有檔案則無法刪除seq生成並顯示一個數字序列,可指定起始、間距與結束值sha1sum⭐ 計算或檢查 SHA1 雜湊值sha224sum計算或檢查 SHA224 雜湊值sha256sum⭐ 計算或檢查 SHA256 雜湊值sha384sum計算或檢查 SHA384 雜湊值

sha512sum計算或檢查 SHA512 雜湊值shuf將輸入內容隨機排列後輸出sleep⭐ 暫停 N 秒sort對檔案內容的行進行排序後顯示,支援字母、數字及逆向排序split⭐ 將一個大檔案分割成固定大小或固定行數的多個小檔案stat顯示檔案或檔案系統的詳細狀態資訊,如權限、大小與時間戳記sum計算檔案的校驗碼與所佔用的磁碟區塊數tac與 cat 相反,從最後一行開始反向顯示檔案內容tail⭐ 顯示檔案的結尾部分,預設輸出最後 10 行tee⭐ 從標準輸入讀取資料,同時將其寫入標準輸出與指定的檔案中test檢查檔案類型或比較數值與字串,常用於 shell 腳本的條件判斷touch⭐ 更新檔案的存取與修改時間;若檔案不存在則會建立一個空檔案tr替換、刪除或壓縮輸入資料中的特定字元,功能強大,但控制語法要花點時間學true不執行任何動作並直接結束,回傳代表「成功」的狀態碼 0truncate將檔案的大小縮減或擴充至指定的尺寸tsort對輸入的字串進行拓撲排序unexpand將每個檔案中的空白轉換成 Tabuniq⭐ 過濾或傳回檔案中連續重複的行,通常與 sort 搭配使用unlink刪除指定的檔案或符號連結(呼叫系統底層 unlink 函數)uptime顯示目前時間、系統運作時間、使用者數量及負載平均值wc⭐ 統計檔案的行數 (Line)、字數 (Word) 與位元組數 (Byte)xargs⭐ 從標準輸入讀取資料並建構為指令列參數來執行程式yes反覆顯示特定字串或 'y',常用於互動輸入時回答,例如:yes | sudo apt-get install {{program}}
常使用 Linux 的同學應多少知道或用過其中的工具,若完全沒接觸過則可趁此機會了解一下,充實自己的兵器庫。
最後來說件有趣的事。
Coreutils 的所有工具 .exe 位於 C:\Program Files\coreutils\bin,若用檔案總管檢視會發現目錄下的「所有 .exe 檔的大小都一樣,而檔案屬性顯示它是一個名為 coreutils 的執行檔。

coreutils.exe 的本尊在 C:\Program Files\coreutils 目錄,bin 下所有 .exe 都是用硬連結建立的分身:

用 fsutil 工具檢查可以發現它不但對應到 /bin .exe 還有 /cmd .cmd:(有些老舊的自動化工具或特殊的 IDE 插件,呼叫外部指令時會預設尋找 .bat 或 .cmd 檔案)

這種一支程式扮演 N 個不同 CLI .exe 的術語叫多重呼叫二進位檔(Multicall Binary)。
原理是程式在命令列執行時作業系統會傳入一組參數 argv (Argument Vector),其中 argv[0] 為執行檔名稱或路徑,argv[1], argv[2]... 為使用者輸入的參數。如此,程式內部可依據 argv[0] 切換執行不同的指令行為,做到把幾十上百個執行檔邏輯塞在同一支程式。
這麼做最大的好處是讓共用邏輯(Library)只在 coreutils.exe 出現一次,不像傳統做法在幾十個指令 .exe 都重複出現,可以減少磁碟空間、節省記憶體及快取,並可做到更新時只需替換一個檔,所有工具一次更新。
此一技術特別適合空間有限的情境,像有名的「嵌入式 Linux 的瑞士刀」BusyBox 便是最有名的例子,它將數百個 Linux 指令封裝成一個極小的單一執行檔,是大多數路由器、IoT 設備和 Docker 基礎鏡像的核心,之前在研究路由器 ssh 環境 curl 閃退問題時已見識過。
Comments
# by Augustus
我常常在 macOS 與 Windows 間切換,覺得用 Microsoft.Coreutils 最爽的是可以 cd path/to/your/target 不會腦筋打結
# by uop
但這套的 ls, rm ...等的一些指令在 powershell 被底層硬綁死 alias 導致無法正確使用變得很...尷尬
# by Jeffrey
to uop,稍微設定一下就可以囉~ https://blog.darkthread.net/blog/clear-ps-aliases/
# by uop
謝謝黑暗大
# by fish
用busybox for windows也差不多吧 https://frippery.org/busybox/