
rclone convmv基于 --name-transform 的文件与目录原地批量重命名实战指南【免费下载链接】rclonersync for cloud storage - Google Drive, S3, Dropbox, Backblaze B2, One Drive, Swift, Hubic, Wasabi, Google Cloud Storage, Azure Blob, Azure Files, Yandex Files项目地址: https://gitcode.com/GitHub_Trending/rc/rcloneconvmv是 rclone 提供的原地in-place重命名命令它不改变文件内容只按你指定的--name-transform规则批量转换远端或本地的文件与目录名称适用于给上千个对象统一加前缀、改编码形式、转小写、按日期重命名等场景。本文覆盖convmv的完整命令形态、全部转换模式与字符映射表、文件/目录作用域标签并结合 lib/transform 与 cmd/convmv 源码解释转换是如何逐段应用的、哪些写法会报错以及并发冲突风险如何规避。命令形态与专属选项convmv的调用形式只有一个远端参数目标路径转换规则通过可重复的--name-transform标志传入rclone convmv dest:path --name-transform XXX [flags]convmv自身的专属选项只有两个在 cmd/convmv/convmv.go 的init()中注册--create-empty-src-dirs Create empty source dirs on destination after move --delete-empty-src-dirs Delete empty source dirs after move -h, --help help for convmv此外它复用 rclone 的通用选项组包括 Copy 选项组其中的--name-transform stringArray即为转换规则的载体描述为 Transform paths during the copy process、Important 选项组-n, --dry-run试跑、-i, --interactive、-v, --verbose以及 Filter 与 Listing 选项组--exclude、--include、--files-from等用于圈定参与转换的对象范围。完整的全局标志可查阅 rclone 帮助页或运行rclone --help。从 cmd/convmv/convmv.go 的Run实现可以看到两条硬性前提必须设置--name-transform否则直接报错--name-transform must be set由 lib/transform/options.go 中的Transforming()检查配置项NameTransform是否为空参数可以是目录对整棵目录树原地重命名也可以是目录文件路径只重命名该单个文件。从源码结构看convmv将参数解析为fdst, srcFileName : cmd.NewFsFile(args[0])当srcFileName为空时调用sync.Transform(ctx, fdst, ...)对整个远端原地转换否则调用operations.TransformFile(ctx, fdst, srcFileName)只处理单个文件。--name-transform 转换模式全表--name-transform支持如下模式值中的 XXXX 为替换内容模式说明prefixXXXX在名称前添加 XXXXsuffixXXXX在名称末尾扩展名之后追加 XXXXsuffix_keep_extensionXXXX追加 XXXX 但保留原扩展名在末尾file.txt→fileXXXX.txttrimprefixXXXX若名称以 XXXX 开头则移除它trimsuffixXXXX若名称以 XXXX 结尾则移除它regexpattern/replacement应用基于正则的转换replaceold:new将名称中所有 old 替换为 newdate{YYYYMMDD}按指定日期格式追加或前缀化日期truncateN截断名称到最多 N 个字符truncate_keep_extensionN截断到最多 N 个字符且保留扩展名truncate_bytesN按 N 个字节而非字符截断truncate_bytes_keep_extensionN按 N 字节截断且保留扩展名base64encode将名称 Base64 编码base64decode将 Base64 编码的名称解码还原encoderENCODING按指定编码掩码转换名称如 ISO-8859-1、Windows-1252、Macintosh 或编码掩码组合decoderENCODING从指定编码解码名称charmapMAP应用字符映射code page转换lowercase名称转小写uppercase名称转大写titlecase名称转 Title Caseascii去除非 ASCII 字符url对名称做 URL 编码nfc/nfd/nfkc/nfkd转换为对应的 Unicode 正规化形式command/path/to/my/program调用外部程序做转换把名称作为参数传入取其标准输出作为新名称完整的转换模式列表源码中 transformChoices.Choices() 定义的枚举值共 36 个含none与indexnone nfc nfd nfkc nfkd replace prefix suffix suffix_keep_extension trimprefix trimsuffix index date truncate truncate_keep_extension truncate_bytes truncate_bytes_keep_extension base64encode base64decode encoder decoder ISO-8859-1 Windows-1252 Macintosh charmap lowercase uppercase titlecase ascii url regex commandcharmapMAP支持的字符映射code page列表IBM-Code-Page-037 IBM-Code-Page-437 IBM-Code-Page-850 IBM-Code-Page-852 IBM-Code-Page-855 Windows-Code-Page-858 IBM-Code-Page-860 IBM-Code-Page-862 IBM-Code-Page-863 IBM-Code-Page-865 IBM-Code-Page-866 IBM-Code-Page-1047 IBM-Code-Page-1140 ISO-8859-1 ISO-8859-2 ISO-8859-3 ISO-8859-4 ISO-8859-5 ISO-8859-6 ISO-8859-7 ISO-8859-8 ISO-8859-9 ISO-8859-10 ISO-8859-13 ISO-8859-14 ISO-8859-15 ISO-8859-16 KOI8-R KOI8-U Macintosh Macintosh-Cyrillic Windows-874 Windows-1250 Windows-1251 Windows-1252 Windows-1253 Windows-1254 Windows-1255 Windows-1256 Windows-1257 Windows-1258 X-User-DefinedencoderENCODING/decoderENCODING使用的编码掩码mask列表Asterisk BackQuote BackSlash Colon CrLf Ctl Del Dollar Dot DoubleQuote Exclamation Hash InvalidUtf8 LeftCrLfHtVt LeftPeriod LeftSpace LeftTilde LtGt None Percent Pipe Question Raw RightCrLfHtVt RightPeriod RightSpace Semicolon SingleQuote Slash SquareBracketfile / dir / all选择作用域标签默认情况下--name-transform只作用于文件的叶名称leaf name。若希望转换目录名或整条路径需要在模式名前加作用域标签标签效果file只转换文件的叶名称默认dir只转换路径中任意位置的目录名all转换文件和目录的整条路径用法是把标签写进转换名里例如--name-transform file,prefixABC或--name-transform dir,prefixDEF。对于 Unicode 正规化这类转换通常用all更合理例如--name-transform all,nfc。对应源码 lib/transform/options.go 中的parseTag()它以file,/dir,/all,前缀识别标签未加前缀时默认为file。在 lib/transform/transform.go 的Path()中可以看到标签的分发逻辑file标签跳过目录、且对文件只转换 base叶名dir标签对文件只转换其目录部分transformDirall则整段路径逐段转换。硬性约束--name-transform不允许向名称中引入路径分隔符/否则报 transform cannot add path separators 错误转换结果若使某个路径段变空也会报 transform cannot render path segments empty。这两条校验由 transform.go 中的validateSegment()执行且Path()在整体转换后还会比较转换前后的/数量——不一致即视为路径段数量必须一致的错误。这是保证转换只做重命名、不改变目录结构的关键设计。实用示例以下示例均出自官方文档//后为转换结果整条路径转大写all标签同时转换目录与文件rclone convmv stories/The Quick Brown Fox!.txt --name-transform all,uppercase // Output: STORIES/THE QUICK BROWN FOX!.TXT链式两个replace按命令行顺序依次应用rclone convmv stories/The Quick Brown Fox!.txt --name-transform all,replaceFox:Turtle --name-transform all,replaceQuick:Slow // Output: stories/The Slow Brown Turtle!.txtBase64 编码整条路径源码中特意使用 URL-safe Base64 以避免输出中出现/rclone convmv stories/The Quick Brown Fox!.txt --name-transform all,base64encode // Output: c3Rvcmllcw/VGhlIFF1aWNrIEJyb3duIEZveCEudHh0反向解码还原注意.DS_Store这类特殊名会原样保留rclone convmv c3Rvcmllcw/VGhlIFF1aWNrIEJyb3duIEZveCEudHh0 --name-transform all,base64decode // Output: stories/The Quick Brown Fox!.txtUnicode 正规化NFC / NFD视觉相同但字节序列不同rclone convmv stories/The Quick Brown Fox Went to the Café!.txt --name-transform all,nfc // Output: stories/The Quick Brown Fox Went to the Café!.txtrclone convmv stories/The Quick Brown Fox Went to the Café!.txt --name-transform all,nfd // Output: stories/The Quick Brown Fox Went to the Café!.txtascii去除非 ASCII 字符狐狸 emoji 被移除留下两个空格rclone convmv stories/The Quick Brown Fox!.txt --name-transform all,ascii // Output: stories/The Quick Brown Fox!.txttrimsuffix去掉扩展名rclone convmv stories/The Quick Brown Fox!.txt --name-transform all,trimsuffix.txt // Output: stories/The Quick Brown Fox!prefix加前缀all标签下目录名同样被加前缀rclone convmv stories/The Quick Brown Fox!.txt --name-transform all,prefixOLD_ // Output: OLD_stories/OLD_The Quick Brown Fox!.txtcharmapISO-8859-7无法映射的字符替换为下划线emoji 与 é 都不在希腊字符集中rclone convmv stories/The Quick Brown Fox Went to the Café!.txt --name-transform all,charmapISO-8859-7 // Output: stories/The Quick Brown _ Fox Went to the Caf_!.txtencoderColon,SquareBracket将:和[/]替换为全角等价物规避文件系统敏感字符rclone convmv stories/The Quick Brown Fox: A Memoir [draft].txt --name-transform all,encoderColon,SquareBracket // Output: stories/The Quick Brown Fox A Memoir draft.txttruncate21按字符截断 记为 1 个字符rclone convmv stories/The Quick Brown Fox Went to the Café!.txt --name-transform all,truncate21 // Output: stories/The Quick Brown Foxcommandecho把每个路径段作为参数传给外部程序取其输出去重命名这里 echo 原样输出结果不变rclone convmv stories/The Quick Brown Fox!.txt --name-transform all,commandecho // Output: stories/The Quick Brown Fox!.txtdate模式{...}中的格式会被当前时间替换后拼接/插入名称。YYYYMMDD与macfriendlytime是源码 TimeFormat() 中显式支持的别名后者对应2006-01-02 0304PM因为 macOS 文件名不能包含冒号其余可直接使用 Go time 布局常量名如RFC3339、Stamp、DateOnly等或任意 Go 时间布局串rclone convmv stories/The Quick Brown Fox! --name-transform date-{YYYYMMDD} // Output: stories/The Quick Brown Fox!-20260731rclone convmv stories/The Quick Brown Fox! --name-transform date-{macfriendlytime} // Output: stories/The Quick Brown Fox!-2026-07-31 0340PMregexpattern/replacement正则接受 Perl 风格语法确切语法以 Go 正则表达式RE2为准。替换串中可用$name或${name}引用捕获组名为命名捕获组名或组序号插入字面$需写作$$rclone convmv stories/The Quick Brown Fox!.txt --name-transform all,regex[\\.\\w]/ab // Output: ababababababab/ababab ababababab ababababab ababab!abababab源码视角转换是如何执行的理解 lib/transform/transform.go 的几个函数可以精确预判convmv的行为Path(ctx, s, isDir)是入口它取出--name-transform选项列表getOptions带解析缓存按用户指定的顺序逐个应用每个转换按路径段segment独立执行transformPath先strings.Split(s, /)再逐段转换后path.Join拼回从而天然保留分隔符结构。转换前后/的数量不一致会直接报错。transformPathSegment是各算法的实现主体几个值得注意的实现细节base64encode使用base64.URLEncoding注释写明 to avoid slashes所以编码结果不会破坏路径结构base64decode对.DS_Store有硬编码豁免且解码失败时记错误但保留原名truncate_bytes会回退搜索确保截断点不切碎多字节 UTF-8 字符无法得到合法 UTF-8 时报错truncate_keep_extension在扩展名比截断上限还长时返回错误扩展名识别由splitExtension完成会借助 MIME 类型表识别.tar.gz这类复合扩展名suffix_keep_extension与truncate_keep_extension共用该扩展名拆分逻辑因此file.tar.gz会被整体视为file.tar.gzcommand通过mapper调用外部程序新名称 exec.Command(command, s)的合并输出并去除首尾空白程序出错时记错误并保留原名。convmv的原地语义目录模式下 sync.go 中Transform()直接以同一个远端作为源和目标runSyncCopyMove(ctx, fdst, fdst, ...)即对同一棵树做移动到自己文件内容不变、只有路径被改写单个文件模式则走 operations.go 的TransformFile()同样复用移动/复制传输通道所以--dry-run、过滤规则和并发参数都同样生效。顺序、冲突与风险控制转换按用户在命令行中指定的顺序依次应用。file默认只改文件叶名dir改任意位置目录名all改整条路径每个转换逐段执行任何引入/或产生空路径段的转换都会报错。把转换排成合理顺序是用户责任。看似冲突的组合如prefix后接trimprefix、nfc后接nfd是允许的——设计者没有强制互斥正是为了支持先剥掉一个前缀再加另一个这类有意场景但某些组合会产生意外结果务必先用--dry-run验证。竞态与非确定性replaceold:new这类转换可能让多个不同源文件映射到同一目标名并发传输时最终状态不确定此后运行rclone check也可能因覆盖结果而误报缺失/差异。官方给出的风险控制建议仔细审查可能引入冲突的转换用--dry-run预演注意它无法展示非确定性转换的最终覆盖结果避免多个不同源文件映射到同一目标名的转换必要时用--transfers1关闭并发prefix等转换每用一次都有叠加放大效应在bisync场景下应特别避免。与 sync / copy / move 的复用--name-transform不是convmv独占的sync、copy、move命令同样接受该标志在传输过程中对路径应用相同的一套转换逻辑。也就是说你可以不先convmv再同步而是在rclone copy --name-transform all,uppercase这类一条命令里完成改名 传输。参数解析、校验规则不得新增/、不得产生空段与上文完全一致冲突风险条款同样适用。版本与适用前提convmv自v1.70引入见 docs/content/commands/rclone_convmv.md 元数据中的versionIntroduced: v1.70以及 cmd/convmv/convmv.go 中的Annotations。使用时请注意命令要求目标远端支持移动/复制操作重命名即同盘移动command模式依赖本地外部程序可执行date模式使用本地时区的当前时间结果随执行时刻变化不具备幂等性——重复执行convmv前需自行评估是否会产生二次叠加尤其prefix/suffix。【免费下载链接】rclonersync for cloud storage - Google Drive, S3, Dropbox, Backblaze B2, One Drive, Swift, Hubic, Wasabi, Google Cloud Storage, Azure Blob, Azure Files, Yandex Files项目地址: https://gitcode.com/GitHub_Trending/rc/rclone创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考