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 每月下载量
84KB
1.5K SLoC
RnR 是一个支持正则表达式的命令行工具,用于 安全地重命名 多个文件和目录。
功能
- 批量重命名文件和目录。
- 自动检查以避免不希望的文件冲突、删除或覆盖。
- 使用正则表达式,包括捕获组。
- 递归包含目录。
- 创建备份文件。
- 从转储文件中创建和读取操作。
- 从转储文件中撤销操作。
- 排除/包含隐藏文件。
- 支持 Linux、Mac 和 Windows,包括终端着色。
- 广泛的单元测试。
- 选择替换限制。
- 将 UTF-8 文件名转换为 ASCII 表示。
安装
二进制文件
GitHub 发布
您可以从 最新发布页面 下载二进制文件,选择与您的平台对应的压缩文件。这些压缩文件包含可执行文件以及其他附加内容,如完成文件(Bash、Zsh、fish 和 PowerShell)。
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 有效 输入参数和文件名。
- 适用于文件和符号链接(忽略目录)。
- 接受多个文件作为参数。
- 接受一个 正则表达式 来生成匹配项。这些表达式具有与
regex
crate 相同的限制。您可以在 此处 检查正则表达式语法。它支持编号和命名的 捕获组。 - 如果递归模式未提供最大深度,则假定 无限。
- 不会生成备份。
- 输出是 彩色 的(仅适用于 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
捕获组
- 捕获三个未命名的组 [
name(1)-number(2).extension(3)
]. - 交换组 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
捕获多个命名组并交换它们
- 捕获两位数字作为
number
。 - 捕获扩展名为
ext
。 - 交换组。
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