#rename #regex #file-rename #directories #command-line-tool #filename #operations

app rnr

RnR 是一个支持正则表达式的命令行工具,用于重命名多个文件和目录

17 个版本

使用旧的 Rust 2015

0.4.2 2023年2月26日
0.4.1 2022年6月12日
0.4.0 2021年12月6日
0.3.1 2021年11月6日
0.1.6 2018年7月31日

#639 in 命令行工具

36 每月下载量

MIT 许可证

84KB
1.5K SLoC

rnr

Build Status Crates.io License

RnR 是一个支持正则表达式的命令行工具,用于 安全地重命名 多个文件和目录。

功能

  • 批量重命名文件和目录。
  • 自动检查以避免不希望的文件冲突、删除或覆盖。
  • 使用正则表达式,包括捕获组。
  • 递归包含目录。
  • 创建备份文件。
  • 从转储文件中创建和读取操作。
  • 从转储文件中撤销操作。
  • 排除/包含隐藏文件。
  • 支持 Linux、Mac 和 Windows,包括终端着色。
  • 广泛的单元测试。
  • 选择替换限制。
  • 将 UTF-8 文件名转换为 ASCII 表示。

安装

二进制文件

GitHub 发布

您可以从 最新发布页面 下载二进制文件,选择与您的平台对应的压缩文件。这些压缩文件包含可执行文件以及其他附加内容,如完成文件(BashZshfishPowerShell)。

Arch Linux

AUR(rnr)中有一个软件包,可以安装 Arch Linux 上的最新版本 RnR

Homebrew

您可以使用 Homebrew 软件包管理器 在 macOS 或 Linux 系统中安装此工具。

brew install rnr

从源代码

RnR 使用 Rust 编写。您可以使用 Cargo 从源代码构建它。

从 git 仓库

git clone https://github.com/ismaelgv/rnr .
cargo install

从 Crates.io

cargo install rnr

用法

选项

USAGE:
    rnr [FLAGS] [OPTIONS] <EXPRESSION> <REPLACEMENT> <PATH(S)>...
    rnr [FLAGS] [OPTIONS] <SUBCOMMAND>

FLAGS:
    -b, --backup          Generate file backups before renaming
    -n, --dry-run         Only show what would be done (default mode)
        --dump            Force dumping operations into a file even in dry-run mode
    -f, --force           Make actual changes to files
    -h, --help            Prints help information
    -x, --hidden          Include hidden files and directories
    -D, --include-dirs    Rename matching directories
        --no-dump         Do not dump operations into a file
    -r, --recursive       Recursive mode
    -s, --silent          Do not print any information
    -V, --version         Prints version information

OPTIONS:
        --color <color>            Set color output mode [default: auto]  [possible values: always, auto, never]
    -d, --max-depth <LEVEL>        Set max depth in recursive mode
    -l, --replace-limit <LIMIT>    Limit of replacements, all matches if set to 0 [default: 1]

ARGS:
    <EXPRESSION>     Expression to match (can be a regex)
    <REPLACEMENT>    Expression replacement
    <PATH(S)>...     Target paths

SUBCOMMANDS:
    from-file    Read operations from a dump file
    help         Prints this message or the help of the given subcommand(s)
    to-ascii     Replace all file name chars with ASCII chars. This operation is extremely lossy.

默认行为

  • 检查所有操作以避免覆盖现有文件。
  • 默认为试运行
  • 仅接受 UTF-8 有效 输入参数和文件名。
  • 适用于文件和符号链接(忽略目录)。
  • 接受多个文件作为参数。
  • 接受一个 正则表达式 来生成匹配项。这些表达式具有与 regexcrate 相同的限制。您可以在 此处 检查正则表达式语法。它支持编号和命名的 捕获组
  • 如果递归模式未提供最大深度,则假定 无限
  • 不会生成备份。
  • 输出是 彩色 的(仅适用于 ANSI 终端)。
  • 忽略隐藏文件和目录。
  • 以强制模式将所有操作输出到文件中。此转储文件可以用于从 from-file 子命令撤销这些操作。
  • 替换次数设置为1。

示例

Windows 注意:在使用 * 的示例中,您需要在 PowerShell 中展开通配符,例如: rnr a b (Get-Item ./*)。这在 cmd.exe 中不受支持。

重命名文件列表

您可以将要重命名的文件列表作为参数传递

rnr -f file renamed ./file-01.txt ./one/file-02.txt ./one/file-03.txt

原始树

.
├── file-01.txt
├── file-02.txt
├── file-03.txt
└── one
    ├── file-01.txt
    ├── file-02.txt
    └── file-03.txt

重命名后的树

.
├── renamed-01.txt
├── file-02.txt
├── file-03.txt
└── one
    ├── file-01.txt
    ├── renamed-02.txt
    └── renamed-03.txt

包含目录

默认情况下,目录会被忽略,但您也可以使用 -D 选项将它们包含到重命名中。

rnr -f -D foo bar ./*

原始树

.
├── foo
│   └── foo.txt
└── foo.txt

重命名后的树

.
├── bar
│   └── foo.txt
└── bar.txt

多次替换

默认情况下,替换限制设置为1,但您可以将此限制配置为替换多个非重叠匹配。如果此选项设置为0,则将替换所有匹配项。

rnr -f -l 0 o u ./*

原始树

.
├── foo.txt
├── foofoo.txt
├── foofoofoo.txt
└── foofoofoofoo.txt

重命名后的树

.
├── fuu.txt
├── fuufuu.txt
├── fuufuufuu.txt
└── fuufuufuufuu.txt

与其他UNIX工具结合使用

您可以使用管道将 rnr 与其他UNIX工具结合使用,以传递参数。

查找1天前的文件并重命名它们
find . -type f +mtime 1 | xargs rnr -f file renamed
从文件中读取文件列表
cat file_list.txt | xargs rnr -f file rename

file_list.txt 内容

file-01.txt
one/file-02.txt
one/file-03.txt

递归重命名

如果传递了递归(-r)选项,则 rnr 将在路径中递归地查找所有文件,而无需深度限制。

rnr -f -r file renamed ./

原始树

.
├── file-01.txt
├── file-02.txt
├── file-03.txt
└── one
    ├── file-01.txt
    ├── file-02.txt
    ├── file-03.txt
    └── two
        ├── file-01.txt
        ├── file-02.txt
        ├── file-03.txt
        └── three
            ├── file-01.txt
            ├── file-02.txt
            └── file-03.txt

重命名后的树

.
├── renamed-01.txt
├── renamed-02.txt
├── renamed-03.txt
└── one
    ├── renamed-01.txt
    ├── renamed-02.txt
    ├── renamed-03.txt
    └── two
        ├── renamed-01.txt
        ├── renamed-02.txt
        ├── renamed-03.txt
        └── three
            ├── renamed-01.txt
            ├── renamed-02.txt
            └── renamed-03.txt

带最大目录深度的递归重命名

同样,您可以在递归操作中结合设置最大目录深度。

rnr -f -r -d 2 file renamed ./

原始树

.
├── file-01.txt
├── file-02.txt
├── file-03.txt
└── one
    ├── file-01.txt
    ├── file-02.txt
    ├── file-03.txt
    └── two
        ├── file-01.txt
        ├── file-02.txt
        ├── file-03.txt
        └── three
            ├── file-01.txt
            ├── file-02.txt
            └── file-03.txt

重命名后的树

.
├── renamed-01.txt
├── renamed-02.txt
├── renamed-03.txt
└── one
    ├── renamed-01.txt
    ├── renamed-02.txt
    ├── renamed-03.txt
    └── two
        ├── file-01.txt
        ├── file-02.txt
        ├── file-03.txt
        └── three
            ├── file-01.txt
            ├── file-02.txt
            └── file-03.txt

递归重命名包括目录和隐藏文件

rnr 默认忽略隐藏文件以加快操作速度并避免与某些特定目录(如 .git/.local/)相关的问题。您可以传递 -x 选项来包括隐藏文件。此外,您还可以使用 -D 选项与 -r 结合使用。

rnr -f -r -D -x foo bar ./

原始树

.
├── .foo_hidden_file.txt
├── foo.txt
├── foo
│   ├── foo.txt
│   └── foo
│       └── foo.txt
└── .foo_hidden_dir
    └── foo.txt

重命名后的树

.
├── .bar_hidden_file.txt
├── bar.txt
├── bar
│   ├── bar.txt
│   └── bar
│       └── bar.txt
└── .bar_hidden_dir
    └── bar.txt

使用转储文件撤销/重做操作

当您执行重命名操作时,rnr 将默认在您执行命令的当前目录中创建一个转储文件。此文件可以用于使用 from-file-u 选项轻松撤销操作。

重命名操作

rnr -f foo bar ./*

撤销上一个操作

rnr from-file -f -u rnr-[timestamp].json

如果您想重做操作,只需传递转储文件而无需任何其他参数

rnr from-file -f rnr-[timestamp].json

在重命名之前创建备份文件

rnr 可以在重命名之前通过传递 -b 选项为任何操作创建备份文件。备份文件名将确保是唯一的,并且如果创建了另一个备份,则不会被覆盖。如果您正在处理许多大型文件,请考虑文件将被复制。

rnr -f -b file renamed ./*

原始树

.
├── file-01.txt
├── file-02.txt
└── file-03.txt

重命名后的树

.
├── file-01.txt.bk
├── file-02.txt.bk
├── file-03.txt.bk
├── renamed-01.txt
├── renamed-02.txt
└── renamed-03.txt

将UTF-8文件名转换为ASCII

rnr 可以将 UTF-8 文件名转换为它们的 ASCII 表示形式。此功能使用 AnyAscii 库 来执行转写。

您可以运行

rnr to-ascii ./*

rnr to-ascii -r .

原始树

.
├── fïlé-01.txt
├── FïĹÊ-02.txt
└── file-03.txt

重命名后的树

.
├── file-01.txt
├── FILE-02.txt
└── file-03.txt

高级正则表达式示例

有关 regex 包中使用的正则表达式的更多信息 请参阅

替换扩展名

rnr -f '\..*$' '.txt' ./*

原始树

.
├── file-01.ext1
├── file-02.ext2
└── file-03.ext3

重命名后的树

.
├── file-01.txt
├── file-02.txt
└── file-03.txt

替换数字

rnr -f '\d' '1' ./*

原始树

.
├── file-01.txt
├── file-02.txt
└── file-03.txt

重命名后的树

.
├── file-11.txt
├── file-12.txt
└── file-13.txt

捕获组

  1. 捕获三个未命名的组 [name(1)-number(2).extension(3)].
  2. 交换组 1(名称)和组 2(数字)。
rnr -f '(\w+)-(\d+).(\w+)' '${2}-${1}.${3}' ./*

原始树

.
├── file-01.txt
├── file-02.txt
└── file-03.txt

重命名后的树

.
├── 01-file.txt
├── 02-file.txt
└── 03-file.txt

捕获多个命名组并交换它们

  1. 捕获两位数字作为 number
  2. 捕获扩展名为 ext
  3. 交换组。
rnr -f '(?P<number>\d{2})\.(?P<ext>\w{3})' '${ext}.${number}' ./*

原始树

.
├── file-01.txt
├── file-02.txt
└── file-03.txt

重命名后的树

.
├── file-txt.01
├── file-txt.02
└── file-txt.03

依赖项

~7–18MB
~225K SLoC