2 个不稳定版本
0.1.0 | 2021 年 5 月 19 日 |
---|---|
0.0.0 | 2021 年 2 月 6 日 |
#1320 在 文件系统
在 nym-cli 中使用
105KB
3K SLoC
Nym 是一个跨平台的库和命令行界面,用于使用模式操作文件。它受到 mmv
的启发,与后者非常松散地基于此。
用法
Nym 命令由标志、选项和模式组成。大多数命令是由从模式匹配源文件和到模式解析目标路径组成的转换。转换包括 append
、copy
、link
和 move
命令。一些命令,如 find
,只使用从模式。
写入文件系统(即,如 copy
这样的转换)的命令默认是交互式的,会打印一个清单然后提示继续写入。可以通过 --interactive
选项控制此行为。
Nym 仅操作文件(除了 --parent
/-p
标志,它会根据到模式创建目标路径的父目录)。命令永远不会应用于目录。例如,不可能复制、链接或移动目录。
以下命令将工作目录树中的所有文件复制到相邻文件,并附加 .bak
扩展名。
nym copy '**' '{#0}.bak'
在这里,copy
是子命令(也称为执行器),**
是从模式,而 {#0}.bak
是到模式。请注意,在大多数 shell 中,模式必须转义以避免与 shell 特性(如扩展)交互。通常,引用模式可以防止这些不希望的行为。
以下命令查找 src
目录下所有扩展名为 .go
或 .rs
的文件。
nym find '**/src/**/*.{go,rs}'
从模式
使用Unix-like的glob模式匹配源文件以进行操作。这些glob模式类似于文字路径,但还支持可以与文件系统上的路径匹配的通配符、字符类和备选方案。匹配提供可捕获的文本,这些文本可以用于to-patterns。
glob模式对路径分隔符有明确的观点。正斜杠/
始终是路径分隔符,反斜杠\
是禁止的(反斜杠用于转义序列,但不支持字面序列\\
)。分隔符在平台之间被标准化;例如,glob模式可以匹配Windows上的路径。
通配符
通配符匹配路径中的一些任意文本,是glob提供的最基本工具。
树形通配符**
匹配零个或多个子目录。这是匹配任意目录的唯一方式;所有其他通配符都不会跨越目录边界。当一个树形通配符参与匹配且不终止模式时,其捕获包括尾随路径分隔符。如果一个树形通配符不参与匹配,其捕获是一个空字符串,不带路径分隔符。树形通配符必须由路径分隔符或终止符(如glob或子glob的开始和/或结束)分隔。如果一个glob仅由树形通配符组成,则它匹配工作目录树中的所有文件。
零个或多个通配符*
和$
匹配零个或多个任何字符,但不包括路径分隔符。零个或多个通配符不能相邻。通配符*
是贪婪的,将匹配最长的可能文本,而通配符$
是懒惰的,将匹配最短的文本。当后面跟有文字时,*
会停在文字的最后出现处,而$
会停在文字的第一个出现处。
恰好一个通配符?
匹配任何单个字符,但不包括路径分隔符。恰好一个通配符不会自动分组,因此连续的通配符模式,如???
,将为每个?
通配符形成不同的捕获。可以使用备选方案将恰好一个通配符组合成一个捕获,例如{???}
(见下文)。
字符类
字符类匹配任何单个字符,这些字符来自一组文字和范围,但不包括路径分隔符。类由方括号[...]
分隔。单个字符文字指定为原样,例如[ab]
以匹配a
或b
。字符范围由两个字符组成,这两个字符由连字符分隔,例如[x-z]
以匹配x
、y
或z
。
单个字符类中可以使用任意数量的字符字面量和范围。例如,[qa-cX-Z]
匹配 q
、a
、b
、c
、X
、Y
或 Z
中的任意一个。
可以在类模式的开头包含一个感叹号 !
来否定字符类。例如,[!a]
匹配除 a
以外的任何字符。
请注意,字符类也可以用于转义元字符,如 *
、$
等,尽管 glob 也支持通过反斜杠 \
进行转义。要在字符类中匹配控制字符 [
、]
和 -
,它们必须通过反斜杠转义,例如 [a\-]
来匹配 a
或 -
。
替代选项
替代选项匹配由花括号 {...,...}
分隔的任意序列的逗号分隔的子 glob。例如,{a?c,x?z,foo}
按顺序匹配子 glob a?c
、x?z
或 foo
。替代选项可以任意嵌套,例如在 a{b,c{d,e{f,g}}}
中。
无论子 glob 的内容如何,替代选项都形成一个单独的捕获组。此捕获来自子 glob 的完整匹配,因此如果子 glob a?c
在 {a?c,x?z}
中匹配 abc
,则捕获文本将是 abc
(而不是作为替代序列之外将匹配的 b
)。可以使用替代选项通过单个子 glob 组合捕获文本,例如 {*.{go,rs}}
来捕获具有特定扩展名的整个文件名,或 {??}
来分组精确的单个通配符序列。
子模式,特别是包含通配符的子模式,必须考虑邻近的模式。例如,不能引入一个只与路径分隔符或终止符相邻的树形通配符,所以foo{bar,baz/**}
是允许的,但foo{bar,**/baz}
是不允许的。因为它会匹配任何内容,所以单个树形通配符在子模式中**决不**被允许,所以foo/{bar,**}
是不允许的。
文本和平台特定功能
glob无法识别的任何组件都被解释为文本。结合对路径分隔符的严格解释,这意味着某些平台特定功能不能作为from-pattern的一部分使用。
特别是,虽然from-pattern可以有根,但不能包含方案或Windows路径前缀。在Windows上,可以通过--tree
/-C
选项使用UNC路径或其他前缀路径,该选项使用本地路径设置要应用from-pattern的目录。例如,以下命令从UNC共享路径\\server\share\src
复制所有文件。
nym copy -p --tree=\\server\share 'src/**' 'C:\\backup\\{#1}'
glob不明确支持父目录的概念。然而,任何不变(文本)前缀都会被平台重新解释为本地路径,所以以..
开始的from-pattern在Unix和Windows上的行为符合预期。例如,以下命令直观地在当前工作目录的父目录中操作。
nym find '../src/*.rs'
然而,..
被解释为一个文本,并且当它跟在glob中的可变(非文本)组件之后时,它只匹配具有文本组件..
的路径。这在使用目录树进行遍历时**永远不会发生**,所以**跟随通配符等可变模式的..
文本匹配不到任何内容,不应该使用**。例如,from-pattern src/**/../*.rs
永远不会产生任何匹配的文件。
目标模式
目标模式解析目标路径。这些模式由文本和替换组成。替换要么是来自相应from-pattern的捕获,要么是读取文件元数据的属性。替换由花括号{...}
分隔。文本形成本地路径。
捕获
捕获使用哈希符号后跟索引索引from-pattern,如{#1}
。这些索引从1开始计数;0索引用于匹配的全文。空花括号也代表匹配的全文,所以{#0}
和{}
是等效的。
捕获可能包含条件。条件根据匹配文本是否为空来指定替换文本。条件使用类似于三元的语法跟随捕获标识符:以一个问号 ?
开头,后面跟非空情况,一个冒号 :
,最后是空情况。每个情况都支持字面量,字面量由方括号 [...]
分隔。在非空情况下,可以使用两个用逗号分隔的字面量来代替周围的词缀和后缀 [...],[...]
。条件情况和替换文本可能为空。
例如,{#1?[],[-]:}
被替换为第一个捕获的匹配文本,并且当该文本是非空时,后面跟着后缀 -
。 {#1?:[unknown]}
被替换为第一个捕获的匹配文本,并且当该文本为空时,被替换为字面量 unknown
。
属性
属性包括源文件元数据在目标路径中,并使用感叹号 !
后跟名称进行指定。属性名称不区分大小写。支持的属性在下面的表中描述。
模式 | 元数据 | 类型/格式 | Cargo 功能 |
---|---|---|---|
{!b3sum} |
BLAKE3 哈希摘要 | 摘要 | property-b3sum (默认) |
{!ctime} |
创建时间戳 | 日期时间 | n/a |
{!md5sum} |
MD5 哈希摘要 | 摘要 | property-md5sum (默认) |
{!mtime} |
修改时间戳 | 日期时间 | n/a |
例如,{!b3sum}
被替换为匹配文件的 BLAKE3 哈希摘要。
属性与数据类型和相应的格式相关联,这些格式将它们转换为替换的输出文本。格式可以可选地在属性名称后跟一个冒号 :
并用方括号 [...]
分隔指定。例如,日期时间数据类型使用类似于 strftime
的格式,并且模式 {!mtime:[%Y]}
输出源文件修改时间戳的四位年份文本。
属性可能需要额外的依赖,其中一些可以在构建中使用Cargo功能进行切换。
文本格式化器
替换(包括捕获和属性)支持可选的文本格式化器。文本格式化器必须出现在替换中竖线|
之后。可以使用任意数量的文本格式化器,它们之间用逗号,
分隔,并按照它们出现的顺序从左到右应用。
文本格式化器与属性格式不同,正如其名称所暗示的,它们仅针对替换的输出文本操作(它们不操作非文本数据)。
填充格式化器使用指定的字符填充将替换文本填充到指定的宽度和对齐。例如,{#1|>4[0]}
使用右对齐和字符0
进行填充将替换文本填充到四列。如果原始替换文本为13
,则在此示例中格式化后变为0013
。还支持通过<
和^
分别实现左对齐和居中对齐。
有三种大小写格式化器:小写、大写和标题大小写,分别对应大小写不敏感的模式lower
、upper
和title
。这些格式化器不接受任何参数,并更改支持字符的大小写。请注意,title
对单词分隔敏感,仅发生在空白和连字符-
(以及_
等,不发生在下划线)之间。
合并格式化器将匹配的输入字符替换为输出字符。例如,{#1|%[_-][~]}
将任何_
或-
实例替换为波浪号~
。
可以将文本格式化器组合起来执行复杂的格式化。例如,以下命令提取文件名中由下划线_
分隔的部分,并使用标题大小写和空格格式化该部分。
nym move '$_$_*.mp4' '{#2|%[-][ ],title}.mp4'
给定一个名为the-show-title_the-episode-title_the-encoding.mp4
的文件,上述转换将将其移动到The Episode Title.mp4
。
包
Nym 的核心功能作为一个独立的库公开,前端则在此库之上开发。以下表格描述了在 Nym 仓库中维护的官方 Rust 包。
包 | 描述 |
---|---|
nym |
实现 Nym 核心功能的库。 |
nym-cli |
nym 命令行界面 (CLI) 的二进制文件。 |
这些包的主版本和次要版本一起升级。
安装
nym
二进制文件可以通过以下描述的方式安装。
仓库
要从仓库的克隆版本安装 nym
,请先安装 Rust(安装 Rust),然后使用 cargo
构建并安装 nym
。
git clone https://github.com/olson-sean-k/nym.git
cd nym/nym-cli
cargo install --locked --path=. --force
默认情况下,这将构建 master
分支,它通常跟踪已测试的即将到来的更改。要安装特定版本,请在使用 cargo install
之前检出版本标签。请注意,不同版本之间的构建说明可能不同;请参阅克隆中的 README
。
git checkout v0.0.0
注册表
要从 crates.io Rust 包注册表安装 nym
的版本,请先安装 Rust(安装 Rust),然后使用 cargo
构建并安装 nym
。
cargo install nym-cli --locked --force
要安装特定版本,请使用 --version
选项。
cargo install nym-cli --version=0.0.0 --locked --force
包
以下表格描述了可用于安装 nym
的包。
平台 | 包 |
---|---|
Arch (AUR) | nym-git |
免责声明
Nym 以原样提供,且 不提供任何保证。在编写本文时,Nym 是实验性的,可能存在错误。可能会发生数据丢失。请 自行承担风险 使用。
依赖项
~7–17MB
~214K SLoC