<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>命令列 on KnightLi的博客</title>
        <link>https://knightli.com/zh-tw/tags/%E5%91%BD%E4%BB%A4%E5%88%97/</link>
        <description>Recent content in 命令列 on KnightLi的博客</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>zh-tw</language>
        <lastBuildDate>Mon, 25 May 2026 00:24:36 +0800</lastBuildDate><atom:link href="https://knightli.com/zh-tw/tags/%E5%91%BD%E4%BB%A4%E5%88%97/index.xml" rel="self" type="application/rss+xml" /><item>
        <title>CLI-Anything：把軟體變成 Agent 可用的命令列</title>
        <link>https://knightli.com/zh-tw/2026/05/25/cli-anything-agent-native-cli/</link>
        <pubDate>Mon, 25 May 2026 00:24:36 +0800</pubDate>
        
        <guid>https://knightli.com/zh-tw/2026/05/25/cli-anything-agent-native-cli/</guid>
        <description>&lt;p&gt;CLI-Anything 是 HKUDS 開源的 Agent 工具化專案，目標是把原本面向人類 GUI 操作的軟體，轉成 AI Agent 更容易呼叫的命令列介面。它不是重新實作一個簡化版軟體，而是圍繞既有程式碼庫和真實後端生成 CLI harness，讓 Agent 可以透過穩定命令、狀態會話和結構化輸出來完成任務。&lt;/p&gt;
&lt;p&gt;這個方向解決的是 Agent 使用軟體時最常見的斷層：GUI 自動化依賴截圖、點擊和座標，容易受介面變化影響；單一 API 又經常覆蓋不完整，Agent 需要自己拼接大量上下文。CLI-Anything 選擇把軟體能力收斂成命令列，因為命令天然適合被模型讀取、組合、驗證，也便於接入腳本和自動化流程。&lt;/p&gt;
&lt;h2 id=&#34;它怎麼工作&#34;&gt;它怎麼工作
&lt;/h2&gt;&lt;p&gt;官方倉庫把 CLI-Anything 描述為一套自動生成 CLI 的流水線。給它一個本機軟體原始碼路徑或 GitHub 倉庫地址後，流程會分析程式碼結構、識別後端和資料模型，設計命令分組，再實作 CLI、測試和文件。&lt;/p&gt;
&lt;p&gt;生成出來的 CLI 通常包含兩種使用方式：一種是面向連續工作的 REPL，會保留專案狀態；另一種是子命令模式，適合腳本和流水線。命令還會提供 JSON 輸出，方便 Agent 直接解析結果，同時保留人類可讀的格式用於除錯。&lt;/p&gt;
&lt;p&gt;官方範例裡，Claude Code 外掛可以這樣使用：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/plugin marketplace add HKUDS/CLI-Anything
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/plugin install cli-anything
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/cli-anything &amp;lt;software-path-or-repo&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;如果已經生成某個軟體的 harness，後續使用方式會更接近普通 Python CLI：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;cd &amp;lt;software&amp;gt;/agent-harness
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pip install -e .
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;cli-anything-&amp;lt;software&amp;gt; --help
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;cli-anything-&amp;lt;software&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;cli-anything-&amp;lt;software&amp;gt; --json &amp;lt;command&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id=&#34;適合什麼場景&#34;&gt;適合什麼場景
&lt;/h2&gt;&lt;p&gt;CLI-Anything 更適合那些「能力在真實軟體裡，但 Agent 不好穩定操作」的場景。例如影像、影片、音訊、辦公文件、3D 建模、資料分析或 AI/ML 工具鏈，只要專案有可分析的程式碼庫、可呼叫的後端或清晰的資料模型，就有機會被包裝成 Agent 可用的命令集。&lt;/p&gt;
&lt;p&gt;它的價值不只是在命令列裡多一層封裝，而是把軟體的關鍵操作變成可發現、可組合、可測試的介面。Agent 可以先透過 &lt;code&gt;--help&lt;/code&gt; 理解能力，再用 JSON 輸出接收結果，並把多個命令串成工作流。對於需要批次處理、自動驗證和持續迭代的任務，這比臨時讓 Agent 點擊介面更可控。&lt;/p&gt;
&lt;h2 id=&#34;需要注意的邊界&#34;&gt;需要注意的邊界
&lt;/h2&gt;&lt;p&gt;CLI-Anything 並不等於任何軟體都能立刻無成本接入。它依賴目標軟體的原始碼、後端能力、檔案格式和可測試性；如果一個軟體高度封閉、關鍵邏輯只存在於 GUI 層，生成高品質 CLI 的難度會明顯上升。&lt;/p&gt;
&lt;p&gt;官方方法論也強調真實後端和測試驗證，這意味著生成 harness 不是只寫幾個命令包裝腳本就結束。要讓它用於嚴肅工作，還需要確認命令覆蓋範圍、輸出格式、依賴安裝、真實軟體呼叫和端到端測試是否可靠。更現實的用法，是先為一個明確工作流生成 CLI，再透過 refine、test、validate 等命令逐步補齊能力。&lt;/p&gt;
&lt;h2 id=&#34;小結&#34;&gt;小結
&lt;/h2&gt;&lt;p&gt;CLI-Anything 的思路很直接：不要讓 Agent 去適應脆弱的人類介面，而是為現有軟體補上一層穩定、結構化、可測試的命令列入口。它適合想把專業軟體納入 Agent 工作流的人，也適合研究「Agent 原生軟體」形態的開發者。真正落地時，重點不在於一句命令生成了多少程式碼，而在於生成的 CLI 是否能呼叫真實能力、保持狀態、輸出結構化結果，並經得起測試。&lt;/p&gt;
</description>
        </item>
        <item>
        <title>Ghostty 文件速讀：安裝、設定與日常使用要點</title>
        <link>https://knightli.com/zh-tw/2026/05/15/ghostty-docs-install-config-usage-guide/</link>
        <pubDate>Fri, 15 May 2026 14:50:11 +0800</pubDate>
        
        <guid>https://knightli.com/zh-tw/2026/05/15/ghostty-docs-install-config-usage-guide/</guid>
        <description>&lt;p&gt;Ghostty 是一個新的終端模擬器，但它不只是「又一個更快的終端」。按照官方文件的說法，它想同時兼顧三個方向：速度、功能和原生桌面體驗。也就是說，它既希望有 GPU 加速和較好的渲染效能，也希望在 macOS 和 Linux 上盡量像一個真正的本機應用，而不是把所有互動都塞進自繪介面裡。&lt;/p&gt;
&lt;p&gt;如果你正在用 iTerm2、Kitty、Alacritty、WezTerm 或系統內建終端，Ghostty 最值得關注的地方不是某一個單點功能，而是它把「開箱即用」和「深度可設定」放在了一起。預設設定已經能直接使用；想繼續折騰時，文件又給了設定檔、主題、快捷鍵、字型、Shell 整合和終端控制序列等完整入口。&lt;/p&gt;
&lt;h2 id=&#34;先看定位&#34;&gt;先看定位
&lt;/h2&gt;&lt;p&gt;Ghostty 的核心定位可以概括為三句話：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;它是跨平台終端模擬器，目前重點覆蓋 macOS 和 Linux。&lt;/li&gt;
&lt;li&gt;它使用平台原生 UI：macOS 端使用 Swift、AppKit 和 SwiftUI，Linux 端使用 Zig 和 GTK4。&lt;/li&gt;
&lt;li&gt;它的終端核心是 &lt;code&gt;libghostty&lt;/code&gt;，GUI 應用圍繞這個共享核心構建。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;這個設計會影響日常體驗。比如分頁、分割視窗、錯誤提示、視窗狀態恢復、系統快捷鍵等能力，不是簡單做成「看起來像桌面應用」的元件，而是盡量貼近所在系統的互動習慣。macOS 和 Linux 預設快捷鍵也會按各自平台約定區分。&lt;/p&gt;
&lt;h2 id=&#34;安裝方式macos-最直接linux-看發行版&#34;&gt;安裝方式：macOS 最直接，Linux 看發行版
&lt;/h2&gt;&lt;p&gt;官方預構建二進位主要面向 macOS。最普通的安裝方式是下載 &lt;code&gt;.dmg&lt;/code&gt;，打開後把 Ghostty 拖到 Applications 目錄。Homebrew 使用者也可以用社群維護的 cask：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;brew install --cask ghostty
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Linux 的情況更分散。Ghostty 文件把不同發行版的套件管理器、社群二進位和原始碼構建分開說明。Arch、Alpine、Gentoo、NixOS、Snap、Solus、Void 等都有對應路徑；如果發行版沒有官方或可信倉庫，文件更傾向於讓使用者從原始碼構建，而不是隨意安裝第三方二進位。&lt;/p&gt;
&lt;p&gt;這點對伺服器和工作機尤其重要：終端模擬器會處理大量輸入輸出、剪貼簿、連結、SSH 工作階段和本機檔案路徑。安裝來源最好保守一點，優先選官方 macOS 套件、發行版倉庫或自己能審計來源的構建流程。&lt;/p&gt;
&lt;h2 id=&#34;設定先別急著複製一大份-dotfiles&#34;&gt;設定：先別急著複製一大份 dotfiles
&lt;/h2&gt;&lt;p&gt;Ghostty 的設定哲學是「零設定可用」。預設字型內建 JetBrains Mono，也帶有 Nerd Font 支援；多數使用者第一次打開就能正常工作。文件甚至建議，如果你發現必須設定某個非主觀選項才舒服，可以先考慮它是不是應該成為預設行為。&lt;/p&gt;
&lt;p&gt;真正需要定製時，Ghostty 使用文字設定檔。當前設定檔名是 &lt;code&gt;config.ghostty&lt;/code&gt;，舊版本也支援 &lt;code&gt;config&lt;/code&gt;。常見路徑包括：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$XDG_CONFIG_HOME/ghostty/config.ghostty
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$XDG_CONFIG_HOME/ghostty/config
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$HOME/.config/ghostty/config.ghostty
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$HOME/.config/ghostty/config
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;macOS 還會讀取：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$HOME/Library/Application Support/com.mitchellh.ghostty/config.ghostty
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$HOME/Library/Application Support/com.mitchellh.ghostty/config
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;設定語法非常直接，就是 &lt;code&gt;key = value&lt;/code&gt;。例如：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;font-family = JetBrains Mono
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;font-size = 14
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;theme = light:Rose Pine Dawn,dark:Rose Pine
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;keybind = ctrl+shift+t=new_tab
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;一個實用建議是：不要一開始就找別人的完整設定照抄。更穩的方式是先裸跑幾天，只改三類東西：字型、字號和主題。等你真的發現快捷鍵、分割視窗、視窗、Shell 整合有摩擦，再逐項加設定。&lt;/p&gt;
&lt;h2 id=&#34;文件查詢本機也能查完整設定&#34;&gt;文件查詢：本機也能查完整設定
&lt;/h2&gt;&lt;p&gt;Ghostty 的設定項很多，官方文件把它們集中在 Option Reference。除了網頁，安裝後也可以從本機查設定參考：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ghostty +show-config --default --docs
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;這個命令會把預設設定和文件輸出到標準輸出，適合接到分頁器裡慢慢搜尋：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ghostty +show-config --default --docs &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; less
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;查看可用字型時可以用：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ghostty +list-fonts
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;查看內建和可用主題時可以用：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ghostty +list-themes
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;查看預設快捷鍵時可以用：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ghostty +list-keybinds --default
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;這些命令比在網路上複製片段更可靠，因為它們來自你當前安裝的 Ghostty 版本。&lt;/p&gt;
&lt;h2 id=&#34;快捷鍵把動作當成核心概念&#34;&gt;快捷鍵：把「動作」當成核心概念
&lt;/h2&gt;&lt;p&gt;Ghostty 的快捷鍵設定格式是：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;keybind = trigger=action
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;code&gt;trigger&lt;/code&gt; 是按鍵觸發方式，&lt;code&gt;action&lt;/code&gt; 是 Ghostty 執行的動作。比如新建分頁、關閉當前 surface、重新載入設定、跳轉到提示符等，都屬於 action。這個模型的好處是清晰：你不是在「改某個選單項」，而是在把一個輸入序列綁定到一個動作。&lt;/p&gt;
&lt;p&gt;設定改完後，可以在執行時重新載入。預設快捷鍵是：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Linux：&lt;code&gt;ctrl+shift+,&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;macOS：&lt;code&gt;cmd+shift+,&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;不過並不是所有設定都能即時生效。有些選項只影響新建終端，有些需要完整重啟。遇到「設定寫了但沒變化」時，先查對應選項說明，比反覆懷疑語法更省時間。&lt;/p&gt;
&lt;h2 id=&#34;主題和字型先用內建再做細調&#34;&gt;主題和字型：先用內建，再做細調
&lt;/h2&gt;&lt;p&gt;Ghostty 自帶大量主題，並支援按系統淺色、深色模式切換不同主題：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;theme = light:Rose Pine Dawn,dark:Rose Pine
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;主題也可以來自自訂檔案。文件提醒得很明確：主題檔案本質上也是 Ghostty 設定檔，可以設定很多設定項，所以不要隨便使用不可信來源的主題。&lt;/p&gt;
&lt;p&gt;字型方面，&lt;code&gt;font-family&lt;/code&gt; 可以重複多次，用來指定 fallback 字型。對多語言環境很實用，比如主字型負責英文和符號，後續字型補中文、日文或其他字元。遇到 emoji、粗體、斜體、連字等顯示細節時，再去 Option Reference 裡查對應選項即可。&lt;/p&gt;
&lt;h2 id=&#34;shell-整合ssh-使用者尤其應該看&#34;&gt;Shell 整合：SSH 使用者尤其應該看
&lt;/h2&gt;&lt;p&gt;Ghostty 支援自動注入 shell integration，覆蓋 &lt;code&gt;bash&lt;/code&gt;、&lt;code&gt;elvish&lt;/code&gt;、&lt;code&gt;fish&lt;/code&gt;、&lt;code&gt;nushell&lt;/code&gt; 和 &lt;code&gt;zsh&lt;/code&gt;。啟用後，一些體驗會更自然，比如：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;新終端從前一個終端的工作目錄打開。&lt;/li&gt;
&lt;li&gt;複雜提示符 resize 時可以重繪，而不是被錯誤回流。&lt;/li&gt;
&lt;li&gt;可以透過提示符標記在命令輸出之間跳轉。&lt;/li&gt;
&lt;li&gt;在提示符處支援更符合編輯習慣的游標行為。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;如果不想自動注入，可以在設定裡關閉：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;shell-integration = none
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;更值得注意的是 SSH。Ghostty 使用 &lt;code&gt;xterm-ghostty&lt;/code&gt; 作為 &lt;code&gt;TERM&lt;/code&gt;，但很多遠端主機還沒有對應的 terminfo。文件提供了 &lt;code&gt;ssh-env&lt;/code&gt; 和 &lt;code&gt;ssh-terminfo&lt;/code&gt; 兩個 shell integration 功能，預設關閉，可以按需啟用：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;shell-integration-features = ssh-env,ssh-terminfo
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;如果你經常連接舊伺服器、容器、跳板機或嚴格管理的生產環境，建議先讀完官方的 Terminfo 和 Shell Integration 文件，再決定是否啟用這些功能。終端能力協商看起來不起眼，但一旦出問題，表現可能是顏色異常、快捷鍵失靈、全螢幕程式顯示錯亂。&lt;/p&gt;
&lt;h2 id=&#34;我的上手順序&#34;&gt;我的上手順序
&lt;/h2&gt;&lt;p&gt;如果只是想判斷 Ghostty 是否適合自己，可以按這個順序試：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;安裝後不寫設定，直接用一天。&lt;/li&gt;
&lt;li&gt;只調整 &lt;code&gt;font-family&lt;/code&gt;、&lt;code&gt;font-size&lt;/code&gt; 和 &lt;code&gt;theme&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;用 &lt;code&gt;ghostty +list-keybinds --default&lt;/code&gt; 看預設快捷鍵，而不是先搬運別人的快捷鍵表。&lt;/li&gt;
&lt;li&gt;如果常用 SSH，優先檢查遠端主機的 terminfo 相容問題。&lt;/li&gt;
&lt;li&gt;最後再處理分割視窗、視窗、透明度、標題列、背景圖等視覺和工作流偏好。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Ghostty 文件寫得比較工程化，適合把它當成「設定參考手冊」而不是「宣傳頁」閱讀。對多數使用者來說，真正的判斷標準也很簡單：預設體驗是否已經舒服，日常編輯器、Shell、SSH、tmux 或 Zellij 是否穩定。如果這幾件事都順，Ghostty 就值得進入你的長期終端候選列表。&lt;/p&gt;
&lt;h2 id=&#34;參考連結&#34;&gt;參考連結
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://ghostty.org/docs&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Ghostty Docs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://ghostty.org/docs/about&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;About Ghostty&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://ghostty.org/docs/config&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Configuration&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://ghostty.org/docs/config/keybind&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Custom Keybindings&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://ghostty.org/docs/install/binary&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Prebuilt Ghostty Binaries and Packages&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://ghostty.org/docs/features/shell-integration&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Shell Integration&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        </item>
        <item>
        <title>fdupes 怎麼控制刪除順序？按目錄優先級保留重複檔案</title>
        <link>https://knightli.com/zh-tw/2026/05/06/fdupes-delete-duplicates-by-directory-priority/</link>
        <pubDate>Wed, 06 May 2026 09:23:09 +0800</pubDate>
        
        <guid>https://knightli.com/zh-tw/2026/05/06/fdupes-delete-duplicates-by-directory-priority/</guid>
        <description>&lt;p&gt;用 &lt;code&gt;fdupes&lt;/code&gt; 刪除重複檔案時，如果有 &lt;code&gt;a&lt;/code&gt;、&lt;code&gt;b&lt;/code&gt;、&lt;code&gt;c&lt;/code&gt; 三個目錄，並且希望優先保留 &lt;code&gt;a&lt;/code&gt;，其次保留 &lt;code&gt;b&lt;/code&gt;，最後刪除 &lt;code&gt;c&lt;/code&gt; 中的重複檔案，關鍵不在於寫一個複雜規則，而在於目錄輸入順序。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;fdupes&lt;/code&gt; 在非互動刪除模式下，會保留每組重複檔案中最先出現的檔案，刪除後續發現的重複項。因此目錄參數要按「保留優先級從高到低」排列。&lt;/p&gt;
&lt;p&gt;也就是說，想實現「先刪 c，再刪 b，最後盡量保留 a」，命令應該寫成：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;fdupes -rdN a b c
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;掃描順序是 &lt;code&gt;a -&amp;gt; b -&amp;gt; c&lt;/code&gt;。當三個目錄中存在相同檔案時，&lt;code&gt;a&lt;/code&gt; 裡的檔案會先被發現並保留，&lt;code&gt;b&lt;/code&gt; 和 &lt;code&gt;c&lt;/code&gt; 中重複的檔案會被刪除。如果只有 &lt;code&gt;b&lt;/code&gt; 和 &lt;code&gt;c&lt;/code&gt; 有重複檔案，則保留 &lt;code&gt;b&lt;/code&gt;，刪除 &lt;code&gt;c&lt;/code&gt;。&lt;/p&gt;
&lt;h2 id=&#34;參數含義&#34;&gt;參數含義
&lt;/h2&gt;&lt;p&gt;常用參數如下：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;-r&lt;/code&gt;：遞迴掃描子目錄。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-d&lt;/code&gt;：刪除重複檔案。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-N&lt;/code&gt;：與 &lt;code&gt;-d&lt;/code&gt; 配合使用，不進入互動確認，自動保留每組重複檔案中的第一個，刪除其餘檔案。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;因此，自動刪除重複檔案的基本格式是：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;fdupes -rdN 目录A 目录B 目录C
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;目錄越靠前，保留優先級越高；目錄越靠後，越容易被刪除。&lt;/p&gt;
&lt;h2 id=&#34;先預覽再刪除&#34;&gt;先預覽再刪除
&lt;/h2&gt;&lt;p&gt;直接使用 &lt;code&gt;-dN&lt;/code&gt; 會刪除檔案，建議先預覽重複檔案分組：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;fdupes -r a b c
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;輸出結果會按重複檔案分組展示。每組中靠前的檔案，就是非互動刪除時更可能被保留的檔案。&lt;/p&gt;
&lt;p&gt;也可以查看統計資訊：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;fdupes -rm a b c
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;如果資料重要，建議先把結果保存下來人工檢查：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;fdupes -r a b c &amp;gt; duplicates.txt
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;確認每組重複檔案的排列順序符合預期後，再執行：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;fdupes -rdN a b c
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id=&#34;子目錄怎麼處理&#34;&gt;子目錄怎麼處理
&lt;/h2&gt;&lt;p&gt;只要開啟 &lt;code&gt;-r&lt;/code&gt;，&lt;code&gt;fdupes&lt;/code&gt; 會遞迴掃描傳入目錄下的所有檔案。決定保留優先級的，仍然是命令中路徑出現的先後順序。&lt;/p&gt;
&lt;p&gt;例如：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;fdupes -rdN dir_a dir_b dir_c
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;這表示：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;dir_a&lt;/code&gt; 的優先級最高。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;dir_b&lt;/code&gt; 次之。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;dir_c&lt;/code&gt; 最低。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;如果 &lt;code&gt;dir_a/sub1/file.txt&lt;/code&gt; 和 &lt;code&gt;dir_c/sub1/file.txt&lt;/code&gt; 內容相同，會保留 &lt;code&gt;dir_a&lt;/code&gt; 下的檔案。如果 &lt;code&gt;dir_a/x/y/file.txt&lt;/code&gt; 和 &lt;code&gt;dir_c/file.txt&lt;/code&gt; 內容相同，也會優先保留 &lt;code&gt;dir_a&lt;/code&gt; 下的檔案。&lt;code&gt;fdupes&lt;/code&gt; 比較的是檔案內容，不要求檔名或目錄層級完全一致。&lt;/p&gt;
&lt;h2 id=&#34;精確控制子目錄優先級&#34;&gt;精確控制子目錄優先級
&lt;/h2&gt;&lt;p&gt;如果只傳父目錄，子目錄內部的掃描順序由 &lt;code&gt;fdupes&lt;/code&gt; 的遍歷邏輯決定。多數情況下，這已經夠用。但如果你想讓某個子目錄擁有更高優先級，就要把它顯式寫在前面。&lt;/p&gt;
&lt;p&gt;例如，希望優先保留 &lt;code&gt;dir_a&lt;/code&gt;，然後保留 &lt;code&gt;dir_b/special&lt;/code&gt;，再處理 &lt;code&gt;dir_b&lt;/code&gt; 的其他內容，最後處理 &lt;code&gt;dir_c&lt;/code&gt;：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;fdupes -rdN dir_a dir_b/special dir_b dir_c
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;這樣 &lt;code&gt;dir_b/special&lt;/code&gt; 會先於 &lt;code&gt;dir_b&lt;/code&gt; 被掃描。之後掃描 &lt;code&gt;dir_b&lt;/code&gt; 時，&lt;code&gt;special&lt;/code&gt; 裡的檔案已經被記錄，整體優先級就會高於 &lt;code&gt;dir_b&lt;/code&gt; 的其他部分。&lt;/p&gt;
&lt;p&gt;這個寫法適合下面這種需求：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;a&lt;/code&gt; 是最重要的基準目錄。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;b&lt;/code&gt; 中某個子目錄比 &lt;code&gt;b&lt;/code&gt; 的其他內容更重要。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;c&lt;/code&gt; 主要作為低優先級備份目錄。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;路徑順序可以繼續擴展：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;fdupes -rdN a b/important b c/keep-first c
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;規則仍然只有一個：越靠前，越優先保留。&lt;/p&gt;
&lt;h2 id=&#34;目錄很多時使用列表&#34;&gt;目錄很多時使用列表
&lt;/h2&gt;&lt;p&gt;如果有很多目錄和子目錄，手動寫一長串命令容易出錯。可以把路徑按優先級寫入一個文字檔，比如 &lt;code&gt;folders.txt&lt;/code&gt;：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/path/to/dir_a
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/path/to/dir_b/sub_important
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/path/to/dir_b
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/path/to/dir_c/sub_1
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/path/to/dir_c
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;然後用 &lt;code&gt;xargs&lt;/code&gt; 傳給 &lt;code&gt;fdupes&lt;/code&gt;：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;cat folders.txt &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; xargs fdupes -rdN
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;如果路徑中可能包含空格，更穩妥的方式是使用空字元分隔：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;tr &lt;span class=&#34;s1&#34;&gt;&amp;#39;\n&amp;#39;&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;\0&amp;#39;&lt;/span&gt; &amp;lt; folders.txt &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; xargs -0 fdupes -rdN
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id=&#34;需要注意的邊界&#34;&gt;需要注意的邊界
&lt;/h2&gt;&lt;p&gt;第一，&lt;code&gt;fdupes&lt;/code&gt; 比較的是檔案內容，而不是檔名。如果兩個檔名完全不同，但內容一致，也會被識別為重複檔案。&lt;/p&gt;
&lt;p&gt;第二，如果 &lt;code&gt;a&lt;/code&gt; 目錄內部本身就有重複檔案，使用 &lt;code&gt;fdupes -rdN a b c&lt;/code&gt; 時，&lt;code&gt;a&lt;/code&gt; 內部靠後的重複項也可能被刪除。這個命令表達的是「按整體掃描順序保留最先出現的檔案」，不是「絕對不刪除 a 中任何檔案」。&lt;/p&gt;
&lt;p&gt;第三，預設情況下，&lt;code&gt;fdupes&lt;/code&gt; 不會跟隨符號連結。如果需要處理軟連結相關檔案，要先確認是否需要加 &lt;code&gt;-s&lt;/code&gt;，以及這樣做是否符合你的資料安全預期。&lt;/p&gt;
&lt;p&gt;第四，&lt;code&gt;fdupes&lt;/code&gt; 只刪除重複檔案，不負責清理空目錄。刪除完成後，如果 &lt;code&gt;b&lt;/code&gt;、&lt;code&gt;c&lt;/code&gt; 中留下了空資料夾，可以再執行：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;find b c -type d -empty -delete
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id=&#34;更安全的操作習慣&#34;&gt;更安全的操作習慣
&lt;/h2&gt;&lt;p&gt;如果目錄裡是重要資料，不建議一上來就執行 &lt;code&gt;-rdN&lt;/code&gt;。更穩的流程是：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;先執行 &lt;code&gt;fdupes -r a b c&lt;/code&gt; 查看重複分組。&lt;/li&gt;
&lt;li&gt;確認每組中排在前面的檔案確實應該保留。&lt;/li&gt;
&lt;li&gt;再執行 &lt;code&gt;fdupes -rdN a b c&lt;/code&gt; 自動刪除。&lt;/li&gt;
&lt;li&gt;刪除後檢查是否需要清理空目錄。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;如果你非常擔心誤刪 &lt;code&gt;a&lt;/code&gt; 中的檔案，可以先只對低優先級目錄做更小範圍的清理，或者把結果匯出後人工篩選。&lt;code&gt;fdupes&lt;/code&gt; 的目錄順序很好用，但它不是權限隔離規則；只要路徑被納入掃描，路徑內部的重複檔案就可能參與刪除判斷。&lt;/p&gt;
&lt;h2 id=&#34;小結&#34;&gt;小結
&lt;/h2&gt;&lt;p&gt;用 &lt;code&gt;fdupes&lt;/code&gt; 按優先級刪除重複檔案，核心就是把「想保留的目錄」放在前面，把「優先刪除的目錄」放在後面。&lt;/p&gt;
&lt;p&gt;想保留 &lt;code&gt;a&lt;/code&gt;，再保留 &lt;code&gt;b&lt;/code&gt;，優先刪除 &lt;code&gt;c&lt;/code&gt;：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;fdupes -rdN a b c
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;想讓某個子目錄優先級更高，就把它單獨寫在父目錄前面：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;fdupes -rdN a b/important b c
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;記住一句話就夠了：&lt;code&gt;fdupes -dN&lt;/code&gt; 會保留先出現的重複檔案，刪除後出現的重複檔案。目錄順序，就是你的保留優先級。&lt;/p&gt;
</description>
        </item>
        <item>
        <title>FFmpeg 的 `-map` 參數詳解：精準選擇影片、音訊與字幕串流</title>
        <link>https://knightli.com/zh-tw/2026/04/02/ffmpeg-map-parameter-guide/</link>
        <pubDate>Thu, 02 Apr 2026 23:14:03 +0800</pubDate>
        
        <guid>https://knightli.com/zh-tw/2026/04/02/ffmpeg-map-parameter-guide/</guid>
        <description>&lt;p&gt;在多音軌、多字幕的影片處理中，&lt;code&gt;-map&lt;/code&gt; 是 FFmpeg 最關鍵也最容易用錯的參數之一。&lt;/p&gt;
&lt;p&gt;如果你不明確指定 &lt;code&gt;-map&lt;/code&gt;，FFmpeg 會依預設規則自動挑選串流，結果常常不是你要的。像是：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;匯出後字幕不見&lt;/li&gt;
&lt;li&gt;選錯音軌語言&lt;/li&gt;
&lt;li&gt;混入不需要的資料串流&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;這篇文章用最常見的情境，講清楚 &lt;code&gt;-map&lt;/code&gt; 怎麼用。&lt;/p&gt;
&lt;h2 id=&#34;先理解什麼是串流&#34;&gt;先理解什麼是「串流」
&lt;/h2&gt;&lt;p&gt;一個容器檔（例如 &lt;code&gt;mp4&lt;/code&gt;、&lt;code&gt;mkv&lt;/code&gt;）通常不只一個內容串流（stream），常見包含：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;影片串流（&lt;code&gt;v&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;音訊串流（&lt;code&gt;a&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;字幕串流（&lt;code&gt;s&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;附件/資料串流（如字型、封面、章節等）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;你可以先用 &lt;code&gt;ffprobe&lt;/code&gt; 看清檔案裡有哪些串流：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ffprobe -hide_banner input.mkv
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id=&#34;-map-的基本語法&#34;&gt;&lt;code&gt;-map&lt;/code&gt; 的基本語法
&lt;/h2&gt;&lt;p&gt;最常見寫法：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;-map input_index[:stream_type][:stream_index]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;例如：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;0:v&lt;/code&gt;：第 1 個輸入檔的所有影片串流&lt;/li&gt;
&lt;li&gt;&lt;code&gt;0:a:0&lt;/code&gt;：第 1 個輸入檔的第 1 條音訊串流&lt;/li&gt;
&lt;li&gt;&lt;code&gt;1:s:1&lt;/code&gt;：第 2 個輸入檔的第 2 條字幕串流&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;說明：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;input_index&lt;/code&gt; 從 &lt;code&gt;0&lt;/code&gt; 開始，對應 &lt;code&gt;-i&lt;/code&gt; 的順序&lt;/li&gt;
&lt;li&gt;&lt;code&gt;stream_index&lt;/code&gt; 也從 &lt;code&gt;0&lt;/code&gt; 開始&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;實戰範例&#34;&gt;實戰範例
&lt;/h2&gt;&lt;h3 id=&#34;1-影片來自-a音訊來自-b&#34;&gt;1) 影片來自 A，音訊來自 B
&lt;/h3&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ffmpeg -i english.mp4 -i french.mp3 &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  -map 0:v:0 -map 1:a:0 &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  -c:v copy -c:a aac &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  french.mp4
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;含義：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;取 &lt;code&gt;english.mp4&lt;/code&gt; 的第 1 條影片串流&lt;/li&gt;
&lt;li&gt;取 &lt;code&gt;french.mp3&lt;/code&gt; 的第 1 條音訊串流&lt;/li&gt;
&lt;li&gt;合併輸出成 &lt;code&gt;french.mp4&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;2-保留第一個輸入的全部串流再額外加一條音軌&#34;&gt;2) 保留第一個輸入的全部串流，再額外加一條音軌
&lt;/h3&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ffmpeg -i english.mp4 -i french.mp3 &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  -map &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt; -map 1:a:0 &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  -c copy &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  english-french.mp4
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;含義：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;-map 0&lt;/code&gt; 先帶上第一個輸入檔的所有串流&lt;/li&gt;
&lt;li&gt;再追加第二個輸入的第 1 條音訊串流&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;兩個很實用的進階技巧&#34;&gt;兩個很實用的進階技巧
&lt;/h2&gt;&lt;h3 id=&#34;1-負映射排除不需要的串流&#34;&gt;1) 負映射：排除不需要的串流
&lt;/h3&gt;&lt;p&gt;例如保留第一個輸入的全部串流，但去掉第 2 條音訊串流：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ffmpeg -i input.mkv -map &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt; -map -0:a:1 -c copy output.mkv
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id=&#34;2-可選映射串流不存在也不中斷&#34;&gt;2) 可選映射：串流不存在也不中斷
&lt;/h3&gt;&lt;p&gt;有些檔案可能沒有字幕，這時可用 &lt;code&gt;?&lt;/code&gt;：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ffmpeg -i input.mp4 -map 0:v -map 0:a -map 0:s? -c copy output.mp4
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;code&gt;0:s?&lt;/code&gt; 表示「有字幕就映射，沒有就跳過，不報錯」。&lt;/p&gt;
&lt;h2 id=&#34;常見坑位&#34;&gt;常見坑位
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;一旦使用 &lt;code&gt;-map&lt;/code&gt;，FFmpeg 就不再自動選流，必須把要的串流都寫出來。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-c copy&lt;/code&gt; 只是封裝複製，不做轉碼；若目標容器不支援某編碼，仍會失敗。&lt;/li&gt;
&lt;li&gt;多輸入時最容易錯的是輸入序號，序號只看 &lt;code&gt;-i&lt;/code&gt; 的先後順序。&lt;/li&gt;
&lt;li&gt;要做穩定腳本時，先 &lt;code&gt;ffprobe&lt;/code&gt; 再生成 &lt;code&gt;-map&lt;/code&gt;，通常比手寫更穩。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;總結&#34;&gt;總結
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;-map&lt;/code&gt; 的核心就一句話：明確告訴 FFmpeg，「從哪個輸入，拿哪類串流，拿第幾條」。&lt;/p&gt;
&lt;p&gt;掌握之後，你就能穩定處理多音軌、多字幕、跨檔合成等複雜場景，避免「輸出不對卻不知道原因」的情況。&lt;/p&gt;
</description>
        </item>
        
    </channel>
</rss>
