一个简化创建 Swift 命令行程序以根据您自己的规则重命名文件的库。
此软件包导出一个符合 Apple ArgumentParser
中的 ParsableArguments
协议的结构体 RenameOptions
。它旨在与 @OptionGroup()
和您自己的 ParsableCommand
一起使用,并提供一个 runRename()
函数,您可以在自己的 run()
中调用它,以实现重命名文件命令中涉及的所有样板式文件系统和字符串处理。您的代码只需要包含自定义的正则表达式或对基本文件名的任何其他操作。
runRename()
接受一个函数参数,该参数带有 inout name
String
(和文件扩展名 String
),您提供此函数来根据需要更改 name
。对于命令行中传递的每个文件,都会调用此函数,并省略目录并分离文件扩展名,然后文件将相应地重命名。保持 name
不变(或更改为空字符串)以不对文件执行任何操作。
RenameOptions
定义了参数 --verbose
/-v
、--quiet
/-q
、--dry-run
、--try
(更不用说 ArgumentParser 提供的默认参数 --help
/-h
和 --generate-completion-script
)。 --dry-run
和 --try
之间的区别在于,如果找不到文件参数,前者会像往常一样失败,而后者将允许任何文件参数,就好像它们是存在的文件一样;两者都会显示重命名的预期结果,而不会真正执行。
它可以很好地与 swift-sh
配合使用,也可以与 sharplet/Regex
软件包配合使用,RenameCommand
通过其 String
扩展函数的重载来扩展它,使您可以更方便地指定不区分大小写。见下文。
在安装了 swift-sh
的情况下,这个简单的 Swift “脚本”源文件 “myrename”(不需要“.swift”扩展名)就是您提供一个功能齐全的自定义文件重命名命令所需的一切
#!/usr/bin/swift sh
import ArgumentParser // apple/swift-argument-parser
import RenameCommand // @jpmhouston
import Regex // @sharplet
struct RenameMoviesCommand: ParsableCommand {
static let configuration = CommandConfiguration(abstract: "Renames my ripped movies from their old name format to how I prefer them now.")
@OptionGroup() var options: RenameCommand.RenameOptions
func run() throws {
try options.runRename() { name, _ in
name.replaceAll(matching: #"\."#, with: " ")
name.replaceFirst(matching: " 720p", .ignoreCase, with: "")
name.replaceFirst(matching: " 1080p", .ignoreCase, with: "")
name.replaceFirst(matching: " ([0-9][0-9][0-9][0-9])$", with: " ($1)")
}
}
}
RenameMoviesCommand.main()
函数 replaceFirst
和 replaceAll
来自 sharplet/Regex
。如果您的脚本也使用此软件包,您还可以将诸如 .ignoreCase
之类的选项传递给这些快捷方式函数,如所示,而不必自己构造一个 Regex
来提供这些选项。
感谢 swift-sh
的魔力,在执行 chmod a+x myrename
并将其移动到 shell 命令路径中的某个位置(例如 /usr/local/bin
)之后,您可以执行以下操作
$ myrename --help
OVERVIEW: Renames my ripped movies from their old name format to how I prefer them now.
USAGE: myrename [<files> ...] [--quiet] [--verbose] [--dry-run] [--try]
ARGUMENTS:
<files> Files to rename.
OPTIONS:
-q, --quiet Suppress non-error output.
-v, --verbose Verbose output (overrides "--quiet").
--dry-run Show what would be renamed (overrides "--quiet", no files are changed).
--try Try hypothetical file names (overrides "--quiet", no files are changed).
-h, --help Show help information.
$ myrename ~/Movies/Die.Hard.1988.720p.mp4
'Die.Hard.1988.720p.mp4' renamed to 'Die Hard (1988).mp4'
如果您使用 fish shell,请添加此 选择函数,您只需以下操作即可重命名当前 Finder 选择
$ myrename (selection)
(留给读者的练习:制作类似的东西,使其在其他 shell 中工作)