<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Fzf on Tarragon</title><link>https://tarrragon.github.io/blog/tags/fzf/</link><description>Recent content in Fzf on Tarragon</description><generator>Hugo -- gohugo.io</generator><language>zh-TW</language><copyright>Tarragon (CC BY 4.0)</copyright><lastBuildDate>Thu, 02 Jul 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://tarrragon.github.io/blog/tags/fzf/index.xml" rel="self" type="application/rss+xml"/><item><title>現代 CLI 替代工具：grep、find、cat 之外的選擇</title><link>https://tarrragon.github.io/blog/linux/tools/cli/modern-cli-replacements/</link><pubDate>Thu, 02 Jul 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/linux/tools/cli/modern-cli-replacements/</guid><description>&lt;p>Linux 的預設指令（&lt;code>grep&lt;/code>、&lt;code>find&lt;/code>、&lt;code>cat&lt;/code>、&lt;code>ls&lt;/code>）能用，但它們是幾十年前為當時的環境設計的。過去十年出現一批用現代語言（多為 Rust）重寫的替代品，在同樣的工作上更快、預設行為更貼近日常開發、輸出更好讀。認識這些替代品的價值不在「預設的錯了」，而在你能在對的情境用更省力的工具——尤其是每天重複幾十次的搜尋與瀏覽。&lt;/p>
&lt;p>這篇按「你原本用什麼」對照現代替代品，講清楚每個替代品解掉原工具的什麼痛點、什麼情境值得換、以及換了要注意的地方。核心的搜尋三件套（&lt;code>ripgrep&lt;/code> / &lt;code>fd&lt;/code> / &lt;code>fzf&lt;/code>）值得優先掌握，其餘按需採用。&lt;/p>
&lt;h2 id="搜尋文字內容grep--ripgreprg">搜尋文字內容：grep → ripgrep（rg）&lt;/h2>
&lt;p>&lt;code>ripgrep&lt;/code>（指令是 &lt;code>rg&lt;/code>）是 &lt;code>grep&lt;/code> 的現代替代品，最大差別在它預設就做了開發者幾乎每次都要的事：遞迴搜尋當前目錄、尊重 &lt;code>.gitignore&lt;/code>（不會翻進 &lt;code>node_modules&lt;/code>、&lt;code>.git&lt;/code>、build 產物）、自動跳過二進位檔、輸出帶顏色與行號。用 &lt;code>grep&lt;/code> 搜整個專案常要寫 &lt;code>grep -rn --exclude-dir=node_modules pattern .&lt;/code>，用 &lt;code>rg pattern&lt;/code> 一句就到位且更快（Rust 實作 + 平行搜尋）。&lt;/p>
&lt;p>什麼情境值得換：在專案目錄裡找程式碼、找字串出現在哪些檔案——這是 &lt;code>rg&lt;/code> 最省力的地方。什麼時候還是用 &lt;code>grep&lt;/code>：處理 pipe 進來的串流（&lt;code>command | grep x&lt;/code>）兩者差不多；寫要在任何機器都能跑的腳本時 &lt;code>grep&lt;/code> 是保證存在的（&lt;code>rg&lt;/code> 要另外裝）。注意點：&lt;code>rg&lt;/code> 預設跳過 &lt;code>.gitignore&lt;/code> 忽略的檔，要搜被忽略的檔案得加 &lt;code>-u&lt;/code>（或 &lt;code>-uu&lt;/code> 連隱藏檔一起）。&lt;/p>
&lt;h2 id="找檔案find--fd">找檔案：find → fd&lt;/h2>
&lt;p>&lt;code>fd&lt;/code> 是 &lt;code>find&lt;/code> 的現代替代品，把 &lt;code>find&lt;/code> 那套冗長語法換成直覺的用法。&lt;code>find . -name '*.md' -type f&lt;/code> 用 &lt;code>fd&lt;/code> 是 &lt;code>fd -e md&lt;/code>；&lt;code>fd pattern&lt;/code> 直接對檔名做模糊比對，一樣預設遞迴、尊重 &lt;code>.gitignore&lt;/code>、跳過隱藏檔、輸出帶色。速度也快得多。&lt;/p>
&lt;p>什麼情境值得換：日常找檔案（「這個 config 檔在哪」「有哪些 .test.ts」）。什麼時候還是用 &lt;code>find&lt;/code>：&lt;code>find&lt;/code> 的 &lt;code>-exec&lt;/code>、複雜的時間 / 權限 / 大小條件組合仍然更全面，寫可攜腳本時 &lt;code>find&lt;/code> 保證存在。注意點：&lt;code>fd&lt;/code> 的正則 / glob 預設是 smart case（有大寫才區分大小寫），跟 &lt;code>find&lt;/code> 的精確比對行為不同。&lt;/p>
&lt;h2 id="互動式模糊搜尋fzf不是替代是加一層">互動式模糊搜尋：fzf（不是替代，是加一層）&lt;/h2>
&lt;p>&lt;code>fzf&lt;/code> 不替代任何工具，它是一層&lt;strong>互動式模糊選擇器&lt;/strong>，把「一堆候選 → 你挑一個」這件事變得極快。它從 stdin 吃候選清單、開一個可即時模糊過濾的介面、把你選的印到 stdout，所以能跟任何產生清單的指令組合：&lt;code>fd -e md | fzf&lt;/code> 挑一個 markdown 檔、&lt;code>git branch | fzf&lt;/code> 挑分支、&lt;code>rg --files | fzf&lt;/code> 挑檔案開。&lt;/p>
&lt;p>最高價值的兩個內建整合：&lt;code>Ctrl+R&lt;/code> 覆寫 shell 的歷史搜尋（模糊搜尋整個命令歷史，比預設的反向搜尋強太多）、&lt;code>Ctrl+T&lt;/code> 把檔案路徑插進當前命令列。這兩個 key binding &lt;strong>不是裝完自動生效的&lt;/strong>，要在 shell 設定裡啟用——新版 &lt;code>fzf&lt;/code> 直接在 &lt;code>.zshrc&lt;/code> / &lt;code>.bashrc&lt;/code> 加一行 &lt;code>eval &amp;quot;$(fzf --zsh)&amp;quot;&lt;/code>（bash 用 &lt;code>--bash&lt;/code>）；舊版則 source 套件附的整合檔（Arch 在 &lt;code>/usr/share/fzf/key-bindings.zsh&lt;/code> 與 &lt;code>completion.zsh&lt;/code>，路徑隨發行版不同）。沒加這行，&lt;code>Ctrl+R&lt;/code> 不會有反應。&lt;code>fd&lt;/code> 跟 &lt;code>rg&lt;/code> 可以當 &lt;code>fzf&lt;/code> 的預設來源，三者是一組。&lt;/p>
&lt;h2 id="看檔案內容cat--bat">看檔案內容：cat → bat&lt;/h2>
&lt;p>&lt;code>bat&lt;/code> 是 &lt;code>cat&lt;/code> 加上語法高亮、行號、Git 修改標記、自動分頁。看程式碼 / 設定檔時比 &lt;code>cat&lt;/code> 好讀很多。&lt;code>bat file.py&lt;/code> 直接帶高亮顯示。&lt;/p>
&lt;p>什麼情境值得換：人在終端機讀檔案內容。什麼時候還是用 &lt;code>cat&lt;/code>：把檔案內容 pipe 給其他程式、或在腳本裡——這時要純內容，用 &lt;code>cat&lt;/code>（&lt;code>bat&lt;/code> 在偵測到輸出不是終端機時會自動退化成類 &lt;code>cat&lt;/code> 行為，但明確用 &lt;code>cat&lt;/code> 更穩）。注意點：&lt;code>bat&lt;/code> 預設會分頁（走 &lt;code>less&lt;/code>），在腳本 / pipe 情境要加 &lt;code>--paging=never&lt;/code> 或 &lt;code>-pp&lt;/code>。&lt;/p>
&lt;h2 id="列目錄ls--eza">列目錄：ls → eza&lt;/h2>
&lt;p>&lt;code>eza&lt;/code>（&lt;code>exa&lt;/code> 的維護接棒者）是 &lt;code>ls&lt;/code> 的現代替代品，預設輸出帶顏色與圖示、更好的欄位對齊、內建 Git 狀態欄、&lt;code>--tree&lt;/code> 直接畫樹狀。&lt;code>eza -la --git&lt;/code> 一眼看到權限、大小、修改時間、Git 狀態。&lt;/p>
&lt;p>什麼情境值得換：人在終端機瀏覽目錄。什麼時候還是用 &lt;code>ls&lt;/code>：腳本裡解析輸出用 &lt;code>ls&lt;/code> 更穩定（現代替代品的欄位格式可能隨版本變），可攜腳本 &lt;code>ls&lt;/code> 保證存在。&lt;/p></description><content:encoded><![CDATA[<p>Linux 的預設指令（<code>grep</code>、<code>find</code>、<code>cat</code>、<code>ls</code>）能用，但它們是幾十年前為當時的環境設計的。過去十年出現一批用現代語言（多為 Rust）重寫的替代品，在同樣的工作上更快、預設行為更貼近日常開發、輸出更好讀。認識這些替代品的價值不在「預設的錯了」，而在你能在對的情境用更省力的工具——尤其是每天重複幾十次的搜尋與瀏覽。</p>
<p>這篇按「你原本用什麼」對照現代替代品，講清楚每個替代品解掉原工具的什麼痛點、什麼情境值得換、以及換了要注意的地方。核心的搜尋三件套（<code>ripgrep</code> / <code>fd</code> / <code>fzf</code>）值得優先掌握，其餘按需採用。</p>
<h2 id="搜尋文字內容grep--ripgreprg">搜尋文字內容：grep → ripgrep（rg）</h2>
<p><code>ripgrep</code>（指令是 <code>rg</code>）是 <code>grep</code> 的現代替代品，最大差別在它預設就做了開發者幾乎每次都要的事：遞迴搜尋當前目錄、尊重 <code>.gitignore</code>（不會翻進 <code>node_modules</code>、<code>.git</code>、build 產物）、自動跳過二進位檔、輸出帶顏色與行號。用 <code>grep</code> 搜整個專案常要寫 <code>grep -rn --exclude-dir=node_modules pattern .</code>，用 <code>rg pattern</code> 一句就到位且更快（Rust 實作 + 平行搜尋）。</p>
<p>什麼情境值得換：在專案目錄裡找程式碼、找字串出現在哪些檔案——這是 <code>rg</code> 最省力的地方。什麼時候還是用 <code>grep</code>：處理 pipe 進來的串流（<code>command | grep x</code>）兩者差不多；寫要在任何機器都能跑的腳本時 <code>grep</code> 是保證存在的（<code>rg</code> 要另外裝）。注意點：<code>rg</code> 預設跳過 <code>.gitignore</code> 忽略的檔，要搜被忽略的檔案得加 <code>-u</code>（或 <code>-uu</code> 連隱藏檔一起）。</p>
<h2 id="找檔案find--fd">找檔案：find → fd</h2>
<p><code>fd</code> 是 <code>find</code> 的現代替代品，把 <code>find</code> 那套冗長語法換成直覺的用法。<code>find . -name '*.md' -type f</code> 用 <code>fd</code> 是 <code>fd -e md</code>；<code>fd pattern</code> 直接對檔名做模糊比對，一樣預設遞迴、尊重 <code>.gitignore</code>、跳過隱藏檔、輸出帶色。速度也快得多。</p>
<p>什麼情境值得換：日常找檔案（「這個 config 檔在哪」「有哪些 .test.ts」）。什麼時候還是用 <code>find</code>：<code>find</code> 的 <code>-exec</code>、複雜的時間 / 權限 / 大小條件組合仍然更全面，寫可攜腳本時 <code>find</code> 保證存在。注意點：<code>fd</code> 的正則 / glob 預設是 smart case（有大寫才區分大小寫），跟 <code>find</code> 的精確比對行為不同。</p>
<h2 id="互動式模糊搜尋fzf不是替代是加一層">互動式模糊搜尋：fzf（不是替代，是加一層）</h2>
<p><code>fzf</code> 不替代任何工具，它是一層<strong>互動式模糊選擇器</strong>，把「一堆候選 → 你挑一個」這件事變得極快。它從 stdin 吃候選清單、開一個可即時模糊過濾的介面、把你選的印到 stdout，所以能跟任何產生清單的指令組合：<code>fd -e md | fzf</code> 挑一個 markdown 檔、<code>git branch | fzf</code> 挑分支、<code>rg --files | fzf</code> 挑檔案開。</p>
<p>最高價值的兩個內建整合：<code>Ctrl+R</code> 覆寫 shell 的歷史搜尋（模糊搜尋整個命令歷史，比預設的反向搜尋強太多）、<code>Ctrl+T</code> 把檔案路徑插進當前命令列。這兩個 key binding <strong>不是裝完自動生效的</strong>，要在 shell 設定裡啟用——新版 <code>fzf</code> 直接在 <code>.zshrc</code> / <code>.bashrc</code> 加一行 <code>eval &quot;$(fzf --zsh)&quot;</code>（bash 用 <code>--bash</code>）；舊版則 source 套件附的整合檔（Arch 在 <code>/usr/share/fzf/key-bindings.zsh</code> 與 <code>completion.zsh</code>，路徑隨發行版不同）。沒加這行，<code>Ctrl+R</code> 不會有反應。<code>fd</code> 跟 <code>rg</code> 可以當 <code>fzf</code> 的預設來源，三者是一組。</p>
<h2 id="看檔案內容cat--bat">看檔案內容：cat → bat</h2>
<p><code>bat</code> 是 <code>cat</code> 加上語法高亮、行號、Git 修改標記、自動分頁。看程式碼 / 設定檔時比 <code>cat</code> 好讀很多。<code>bat file.py</code> 直接帶高亮顯示。</p>
<p>什麼情境值得換：人在終端機讀檔案內容。什麼時候還是用 <code>cat</code>：把檔案內容 pipe 給其他程式、或在腳本裡——這時要純內容，用 <code>cat</code>（<code>bat</code> 在偵測到輸出不是終端機時會自動退化成類 <code>cat</code> 行為，但明確用 <code>cat</code> 更穩）。注意點：<code>bat</code> 預設會分頁（走 <code>less</code>），在腳本 / pipe 情境要加 <code>--paging=never</code> 或 <code>-pp</code>。</p>
<h2 id="列目錄ls--eza">列目錄：ls → eza</h2>
<p><code>eza</code>（<code>exa</code> 的維護接棒者）是 <code>ls</code> 的現代替代品，預設輸出帶顏色與圖示、更好的欄位對齊、內建 Git 狀態欄、<code>--tree</code> 直接畫樹狀。<code>eza -la --git</code> 一眼看到權限、大小、修改時間、Git 狀態。</p>
<p>什麼情境值得換：人在終端機瀏覽目錄。什麼時候還是用 <code>ls</code>：腳本裡解析輸出用 <code>ls</code> 更穩定（現代替代品的欄位格式可能隨版本變），可攜腳本 <code>ls</code> 保證存在。</p>
<h2 id="其他常見替代">其他常見替代</h2>
<p>按需採用，痛點對上了再裝：</p>
<table>
  <thead>
      <tr>
          <th>原工具</th>
          <th>替代品</th>
          <th>解的痛點</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><code>cd</code></td>
          <td><code>zoxide</code></td>
          <td>記住常去的目錄，<code>z proj</code> 跳到最常用的（需 <code>eval &quot;$(zoxide init zsh)&quot;</code> 進 shell 才攔截 <code>z</code>）</td>
      </tr>
      <tr>
          <td><code>ps</code></td>
          <td><code>procs</code></td>
          <td>帶色、預設欄位更實用、支援樹狀與關鍵字過濾</td>
      </tr>
      <tr>
          <td><code>du</code></td>
          <td><code>ncdu</code> / <code>dust</code></td>
          <td>找誰佔空間：<code>ncdu</code> 互動逐層鑽 + 就地刪，<code>dust</code> 一次性樹狀視覺（見下）</td>
      </tr>
      <tr>
          <td><code>df</code></td>
          <td><code>duf</code></td>
          <td>表格化、帶色、好讀的磁碟用量</td>
      </tr>
      <tr>
          <td><code>top</code></td>
          <td><code>htop</code> / <code>btop</code></td>
          <td>互動式監控：<code>htop</code> 輕量近乎必備，<code>btop</code> 更完整的全螢幕儀表（見下）</td>
      </tr>
      <tr>
          <td><code>git diff</code></td>
          <td><code>delta</code> / <code>difftastic</code></td>
          <td>diff pager：<code>delta</code> 語法高亮 + 並排，<code>difftastic</code> 語法感知（比 AST 不比行；執行檔是 <code>difft</code>）</td>
      </tr>
      <tr>
          <td><code>man</code></td>
          <td><code>tldr</code></td>
          <td>只給常用範例，不用讀完整 man page</td>
      </tr>
      <tr>
          <td><code>sed</code>（簡單替換）</td>
          <td><code>sd</code></td>
          <td>直覺的 <code>sd 舊 新</code>，不用記 <code>sed</code> 的跳脫規則</td>
      </tr>
  </tbody>
</table>
<p>有兩個替代品的那幾格，差別不是「新舊」而是不同的使用模型，值得分清楚：</p>
<ul>
<li><strong><code>du</code> 的 <code>ncdu</code> vs <code>dust</code></strong>：兩者解的動作不同。<code>ncdu</code> 是互動式的——它掃一次目錄，開一個能逐層往下鑽、當場按鍵刪檔的介面，是「磁碟滿了、要找出並清掉大檔」這個任務的正典（清空間邊找邊刪）。<code>dust</code> 是一次性的——跑完印一張樹狀 + 長條的靜態報告，適合「快速看一眼誰佔空間」而不打算就地刪。要清理用 <code>ncdu</code>，要瞄一眼用 <code>dust</code>。</li>
<li><strong><code>top</code> 的 <code>htop</code> vs <code>btop</code></strong>：<code>htop</code> 是輕量、幾乎每台機器都該有的安全預設——彩色、可捲動、能直接對 process 送訊號，資源佔用極低，SSH 進一台陌生機器臨時看負載首選它。<code>btop</code> 是更完整的全螢幕儀表（CPU / 記憶體 / 網路 / 磁碟的圖形化面板），好看資訊多，但相對重、依賴多；當常駐監控台用很讚，臨時排查用 <code>htop</code> 更快到位。TUI 監控工具的完整比較見 <a href="../tui-monitoring-tools/">TUI 監控工具</a>。</li>
</ul>
<h2 id="採用策略與注意事項">採用策略與注意事項</h2>
<p><strong>優先順序</strong>：搜尋三件套（<code>rg</code> / <code>fd</code> / <code>fzf</code>）投報率最高，每天用幾十次、學習成本低，先裝這三個。<code>bat</code> / <code>eza</code> 是體驗提升，其餘按痛點採用。</p>
<p><strong>跨機器 / CI 的腳本別依賴它們</strong>：要在別台機器或 CI 跑的腳本，用保證存在的 <code>grep</code> / <code>find</code> / <code>cat</code>，因為現代替代品不一定裝了。專案內部、已宣告了 dev 依賴的腳本（devcontainer、Makefile）另當別論——那裡明確裝了 <code>rg</code> / <code>fd</code>，用它們（甚至還因為 <code>rg</code> 尊重 <code>.gitignore</code> 的語意才選它）很合理。分界是「這段腳本會在沒裝這些工具的環境跑嗎」，不是「腳本一律不能用」。</p>
<p><strong>安裝</strong>：多數在各發行版套件庫直接有。Arch：<code>pacman -S ripgrep fd fzf bat eza zoxide</code>，按需再加 <code>procs ncdu htop git-delta</code>（<code>delta</code> 的套件名是 <code>git-delta</code>）。Debian / Ubuntu 有兩個要注意的改名坑——<code>fd</code> 的執行檔在 apt 上叫 <code>fdfind</code>、<code>bat</code> 叫 <code>batcat</code>（都是為了避免跟既有套件撞名），要自己 alias 回 <code>fd</code> / <code>bat</code>；<code>eza</code> 較舊的 apt 源可能還沒有，用 cargo 或官方 repo 裝。macOS 用 <code>brew install ripgrep fd fzf bat eza zoxide</code>。裝好後它們該進你的 <a href="/blog/linux/dotfile/08-sync-bootstrap/bootstrap-script-packages/" data-link-title="Bootstrap Script 與套件清單管理" data-link-desc="寫 dotfile 的 install script、或整理「這台機器裝了什麼」的套件清單時回來讀">dotfile 套件清單</a>，新機器 bootstrap 時一次裝齊。</p>
<h2 id="相關">相關</h2>
<ul>
<li>這篇是「日常指令替代」；全螢幕 TUI 工具（監控、Git、檔案瀏覽、資料庫）見 <a href="../">CLI 環境工具</a> 的其他文章。</li>
<li>為什麼把工具當成「有取捨的選項」而非唯一答案，見 <a href="../">工具選單總覽</a>。</li>
<li>這些工具進 dotfile 套件清單、一鍵安裝的做法，見 <a href="/blog/linux/dotfile/08-sync-bootstrap/bootstrap-script-packages/" data-link-title="Bootstrap Script 與套件清單管理" data-link-desc="寫 dotfile 的 install script、或整理「這台機器裝了什麼」的套件清單時回來讀">模組八：Bootstrap script 與套件清單</a>。</li>
</ul>
]]></content:encoded></item></channel></rss>