<?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/tags/%E5%91%BD%E4%BB%A4%E8%A1%8C/</link>
        <description>Recent content in 命令行 on KnightLi的博客</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>zh-cn</language>
        <lastBuildDate>Mon, 25 May 2026 00:24:36 +0800</lastBuildDate><atom:link href="https://knightli.com/tags/%E5%91%BD%E4%BB%A4%E8%A1%8C/index.xml" rel="self" type="application/rss+xml" /><item>
        <title>CLI-Anything：把软件变成 Agent 可用的命令行</title>
        <link>https://knightli.com/2026/05/25/cli-anything-agent-native-cli/</link>
        <pubDate>Mon, 25 May 2026 00:24:36 +0800</pubDate>
        
        <guid>https://knightli.com/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/2026/05/15/ghostty-docs-install-config-usage-guide/</link>
        <pubDate>Fri, 15 May 2026 14:50:11 +0800</pubDate>
        
        <guid>https://knightli.com/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/2026/05/06/fdupes-delete-duplicates-by-directory-priority/</link>
        <pubDate>Wed, 06 May 2026 09:23:09 +0800</pubDate>
        
        <guid>https://knightli.com/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/2026/04/02/ffmpeg-map-parameter-guide/</link>
        <pubDate>Thu, 02 Apr 2026 23:14:03 +0800</pubDate>
        
        <guid>https://knightli.com/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>
