@yaohaixiao/renames.js 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (54) hide show
  1. package/.editorconfig +9 -0
  2. package/.husky/commit-msg +4 -0
  3. package/.husky/pre-commit +3 -0
  4. package/.prettierignore +28 -0
  5. package/.prettierrc.js +41 -0
  6. package/LICENSE +21 -0
  7. package/README.md +239 -0
  8. package/bin/renames.js +415 -0
  9. package/commitlint.config.js +42 -0
  10. package/config/default.config.json +20 -0
  11. package/eslint.config.js +196 -0
  12. package/index.js +14 -0
  13. package/jest.config.js +51 -0
  14. package/jsconfig.json +9 -0
  15. package/lib/batch-rename.js +190 -0
  16. package/lib/create-config.js +265 -0
  17. package/lib/generate-filename.js +182 -0
  18. package/lib/read-list.js +87 -0
  19. package/lib/utils/get-basename.js +18 -0
  20. package/lib/utils/get-extension.js +20 -0
  21. package/lib/utils/is-empty-object.js +23 -0
  22. package/lib/utils/is-file-exists.js +26 -0
  23. package/lib/utils/is-function.js +29 -0
  24. package/lib/utils/pad-start.js +31 -0
  25. package/lib/utils/pad-zero.js +24 -0
  26. package/lib/utils/read-dir.js +73 -0
  27. package/lib/utils/read-file.js +56 -0
  28. package/lib/utils/remove-file.js +60 -0
  29. package/lib/utils/rename.js +74 -0
  30. package/lib/utils/replace-index-chapter.js +53 -0
  31. package/lib/utils/show-warning-log.js +20 -0
  32. package/lib/utils/sort-files.js +157 -0
  33. package/lib/utils/strip-non-digit.js +16 -0
  34. package/lib/utils/terminal-link.js +16 -0
  35. package/lib/utils/to-index-chapter.js +19 -0
  36. package/lib/utils/write-file.js +35 -0
  37. package/package.json +114 -0
  38. package/tests/batch-rename.spec.js +123 -0
  39. package/tests/get-basename.spec.js +23 -0
  40. package/tests/get-extension.spec.js +24 -0
  41. package/tests/is-empty-object.spec.js +73 -0
  42. package/tests/is-file-exsits.spec.js +17 -0
  43. package/tests/is-function.spec.js +63 -0
  44. package/tests/pad-start.spec.js +27 -0
  45. package/tests/pad-zero.spec.js +15 -0
  46. package/tests/read-dir.spec.js +42 -0
  47. package/tests/read-file.spec.js +52 -0
  48. package/tests/read-list.spec.js +91 -0
  49. package/tests/rename.spec.js +50 -0
  50. package/tests/replace-index-chapter.spec.js +40 -0
  51. package/tests/sort-files.spec.js +221 -0
  52. package/tests/strip-non-digit.spec.js +15 -0
  53. package/tests/to-index-chapter.spec.js +31 -0
  54. package/tests/write-file.spec.js +34 -0
package/.editorconfig ADDED
@@ -0,0 +1,9 @@
1
+ root = true
2
+
3
+ [*]
4
+ charset = utf-8
5
+ indent_style = space
6
+ indent_size = 2
7
+ end_of_line = lf
8
+ insert_final_newline = true
9
+ trim_trailing_whitespace = true
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env sh
2
+ . "$(dirname -- "$0")/_/husky.sh"
3
+
4
+ npx commitlint --edit
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env husky
2
+
3
+ npx lint-staged
@@ -0,0 +1,28 @@
1
+ # dependencies
2
+ **/node_modules
3
+
4
+ # production
5
+ /dist
6
+ /docs
7
+ /.vscode
8
+ /report
9
+ /tests
10
+
11
+ # misc
12
+ npm-debug.log*
13
+
14
+ /coverage
15
+ .idea
16
+ package-lock.json
17
+
18
+ # visual studio code
19
+ .history
20
+ *.log
21
+ functions/*
22
+ .temp/**
23
+
24
+ # screenshot
25
+ screenshot
26
+ .firebase
27
+
28
+ .husky
package/.prettierrc.js ADDED
@@ -0,0 +1,41 @@
1
+ /**
2
+ * # .prettierrc.js - prettier 配置文件
3
+ *
4
+ * Created By: Yaohaixiao Update: 2026.1.10
5
+ */
6
+ export default {
7
+ // 单行长度
8
+ printWidth: 80,
9
+ // 缩进长度
10
+ tabWidth: 2,
11
+ // 使用空格代替tab缩进
12
+ useTabs: false,
13
+ // 句末使用分号
14
+ semi: false,
15
+ // 使用单引号
16
+ singleQuote: true,
17
+ // 仅在必需时为对象的key添加引号
18
+ quoteProps: 'as-needed',
19
+ // 多行时尽可能打印尾随逗号
20
+ trailingComma: 'none',
21
+ // 在对象前后添加空格 eg: { foo: bar }
22
+ bracketSpacing: true,
23
+ // 单参数箭头函数参数周围使用圆括号 eg: (x) => x
24
+ arrowParens: 'always',
25
+ // 无需顶部注释即可格式化
26
+ requirePragma: false,
27
+ // 在已被 preitter 格式化的文件顶部加上标注
28
+ insertPragma: false,
29
+ //
30
+ proseWrap: 'always',
31
+ // 对HTML全局空白不敏感
32
+ htmlWhitespaceSensitivity: 'ignore',
33
+ // 不对vue中的script及style标签缩进
34
+ vueIndentScriptAndStyle: false,
35
+ // 结束行形式
36
+ endOfLine: 'auto',
37
+ bracketSameLine: true,
38
+ singleAttributePerLine: true,
39
+ // 对引用代码进行格式化
40
+ embeddedLanguageFormatting: 'auto',
41
+ };
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 Robert Yao
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,239 @@
1
+ # renames.js
2
+
3
+ renames.js - 基于 Node 的批量文件名重命名 cli 工具库。
4
+
5
+ ## Features
6
+
7
+ - 方便快捷,配置灵活;
8
+ - 支持指定文件名列表数据或者文件名列表文件;
9
+ - 支持文件名自动生成索引;
10
+ - 支持文件名自定义过滤;
11
+ - 支持文件名自定义排序;
12
+ - 支持文件名自定义格式化;
13
+
14
+ ## Usage
15
+
16
+ renames.js 使用方式如下:
17
+
18
+ ```bash
19
+ renames [arguments|command] [options]
20
+ ```
21
+
22
+ renames.js 和其它 cli 工具一样,也可以通过 -h 选项获取完整帮助信息,命令如下:
23
+
24
+ ```bash
25
+ renames -h
26
+ ```
27
+
28
+ renames.js 提供目前提供一个 arguments(dir-path)参数和一个 command(init)子命令,以及10多个 options 配置信息。
29
+
30
+ ### Arguments:
31
+
32
+ - dir-path - 可选,目标文件夹(绝对或相对)路径,如不设置,则使用 renames.config.js 中的 dirPath。
33
+
34
+ 使用 dir-path 参数的命令如下:
35
+
36
+ ```bash
37
+ renames C:\Downloads --autoIndex only
38
+ ```
39
+
40
+ 当然,我们可以指定更多的 options 配置选项指定具体的文件重命名的操作细节信息。
41
+
42
+ ### Options
43
+
44
+ renames.js 提供了较为丰富的 options 参数,用以控制重命名的操作细节处理方式:
45
+
46
+ | 参数名 | 参数说明 |
47
+ | -------------------------------- | --------------------------------------------------------------------------------------------------------------- |
48
+ | -h, --help | display help for command |
49
+ | --dir, --dirPath <dirPath> | 可选,目标文件夹(绝对或相对)路径(注意:仅 init 命令支持) |
50
+ | --names, --namesList <namesList> | 可选,文件名列表数组数据,例如:"新的开始,完美结局"。或者文件名列表文件的路径,例如:"C:\Downloads\names.txt"。 |
51
+ | --prefix <prefix> | 可选,文件名的前缀字符串,例如:"动画片-第01话:新的开始-1080p.mp4"中的"动画片" |
52
+ | --suffix <suffix> | 可选,文件名的后缀字符串,例如:"动画片-第01话:新的开始-1080p.mp4"中的"1080p" |
53
+ | --connector <connector> | 可选,文件名的前/后缀字符串间的连接字符串,例如:"动画片-第01话:新的开始-1080p.mp4"中的"-" |
54
+ | --autoIndex [enable] | 可选,是否自动生成索引编号(default:false) |
55
+ | --startIndex <startIndex> | 可选,索引编号起始值(default:0) |
56
+ | --indexPadZero [enable] | 可选,是否自动用"0"填充索引编号(default:true) |
57
+ | --indexPrefix <indexPrefix> | 可选,索引编号的前缀字符串,例如:"第01话:新的开始.mp4"中的"第" (default: "第") |
58
+ | --indexSuffix <indexSuffix> | 可选,索引编号的后缀字符串,例如:"第01话:新的开始.mp4"中的"话" (default: "集") |
59
+ | --delimiter <delimiter> | 可选,索引编号和的前/后缀字符串间的连接符,例如:"第01话:新的开始.mp4"中的":" (default: ":") |
60
+ | -f, --force [enable] | 可选,是否强制重命名(default:false) |
61
+ | --ext, --extname <extname> | 可选,重命名后的扩展名,例如:".txt" |
62
+ | --sort, --sortBy <sortBy> | 可选,排序类型,可选项:name、type、size、birthtime 和 modify-time (default: "name") |
63
+ | --order <order> | 可选,排序方式,可选项:desc 和 asc (default: "asc") |
64
+ | --sensitivity <sensitivity> | 可选,排序方式为 name 时,大小写/重音处理的方式,可选项:base、accent、case 和 variant (default: "base") |
65
+
66
+ 例如希望将 C:\Downloads 目录下的文件批量重命名为数字索引的信息,可以输入以下命令:
67
+
68
+ ```bash
69
+ renames C:\Downloads --autoIndex only
70
+ ```
71
+
72
+ ### Command
73
+
74
+ renames.js 目前仅提供了一个 init 子命令。
75
+
76
+ #### init 子命令
77
+
78
+ init 子命令是用来创建名为 renames.config.js 配置文件的,命令如下:
79
+
80
+ ```bash
81
+ renames init
82
+ ```
83
+
84
+ 输入以上命令,renames.js 会提示输入 dirPath 和 namesList 两个重要的配置参数。
85
+
86
+ #### 获取 init 子命令的帮助信息
87
+
88
+ 当然,renames.js 也可以直接在 init 命令后添加各种不同的 options 参数。查看完整的 options 参数信息的命令如下:
89
+
90
+ ```bash
91
+ renames init -h
92
+ ```
93
+
94
+ #### init 命令传递 options 配置参数
95
+
96
+ 以下展示通过传递 options 参数中的 dirPath 和 namesList 信息生成配置文件的方法,命令如下:
97
+
98
+ ```bash
99
+ renames init --dir C:\Downloads --names C:\Downloads\names.txt
100
+ ```
101
+
102
+ 以上命令的功能是将 C:\Downloads 文件夹下的文件名,已 names.txt 文件中的文件列表数据进行重命名。
103
+
104
+ ## renames.config.js 配置文件
105
+
106
+ 通过 init 命令生成 renames.config.js 文件的内容如下:
107
+
108
+ ```js
109
+ export default {
110
+ dirPath: 'C:\\Downloads',
111
+ namesList: 'C:\\Downloads\\names.txt',
112
+ prefix: '',
113
+ suffix: '',
114
+ connector: '',
115
+ autoIndex: false,
116
+ startIndex: 0,
117
+ indexPadZero: true,
118
+ indexPrefix: '第',
119
+ indexSuffix: '集',
120
+ delimiter: ':',
121
+ force: false,
122
+ extname: '',
123
+ // 指定过滤 dirPath 文件夹中的文件过滤方法
124
+ filter: null,
125
+ // 可以是排序方式的名称(可选项:name、type、size、birthtime 和 modify-time),也可以是具体的处理函数
126
+ sortBy: 'name',
127
+ order: 'desc',
128
+ sensitivity: 'base',
129
+ // 指定对最终文件名字的格式化处理函数
130
+ format: null,
131
+ };
132
+ ```
133
+
134
+ 除了输出以上的配置文件内容,工具还会采用蓝色的链接文字显示 renames.config.js 的文件路径。(Windows 环境)可以按 Ctrl 键点并用鼠标击链接文本打开文件进行编辑。
135
+
136
+ ### 特殊配置
137
+
138
+ renames.js 处理 options 参数中的配置信息外,在 renames.config.js 配置文件中,还额外提供了3个特殊的配置:
139
+
140
+ - filter - 过滤文件处理函数
141
+ - sortBy - 排序方式,可以是排序的名称或者具体的处理函数
142
+ - format - 文件名字的格式化处理函数
143
+
144
+ #### filter
145
+
146
+ filter 参数可以用来过滤 dirPath 文件夹中的文件,例如 C:\Downloads 中的文件如下:
147
+
148
+ - tinified.zip
149
+ - 83665500d425db4a902c3d4d36f5181e24380200.jpg
150
+ - 77665500d425db4a902c3d4d36f5181e24380200.jpg
151
+ - names.txt
152
+
153
+ 我们希望过滤文件列表中的 .jpg 图片文件,配置如下:
154
+
155
+ ```js
156
+ // renames.js 内部提供的功能函数
157
+ import getExtension from '@yaohaixiao/renames.js/lib/utils/get-extension';
158
+
159
+ export default {
160
+ dirPath: 'C:\\Downloads',
161
+ // ...省略其它默认参数
162
+ // 指定过滤 dirPath 文件夹中的文件过滤方法
163
+ filter: (files) => {
164
+ // files 为 dirPath 下所有文件的数组数据
165
+ return files.filter((filename) => {
166
+ // getExtension 函数用以获取文件名中的扩展名
167
+ return getExtension(filename) === '.jpg';
168
+ });
169
+ },
170
+ };
171
+ ```
172
+
173
+ #### sortBy
174
+
175
+ sortBy 参数可以给文件夹中的文件进行排序,例如 C:\Downloads 中的文件如下:
176
+
177
+ - tinified.zip
178
+ - 83665500d425db4a902c3d4d36f5181e24380200.jpg
179
+ - 77665500d425db4a902c3d4d36f5181e24380200.jpg
180
+ - names.txt
181
+
182
+ 我们希望通过文件大小进行排序,配置如下:
183
+
184
+ ```js
185
+ export default {
186
+ dirPath: 'C:\\Downloads',
187
+ // ...省略其它默认参数
188
+ sortBy: 'size',
189
+ };
190
+ ```
191
+
192
+ 如果你希望的排序方式不在 name、type、size、birthtime 和 modify-time 这几种内置方式中,例如我们希望按文件名首字符 Unicode 编码值进行升序排序,配置如下:
193
+
194
+ ```js
195
+ // renames.js 内部提供的功能函数
196
+ import getBasename from '@yaohaixiao/renames.js/lib/utils/get-basename';
197
+
198
+ export default {
199
+ dirPath: 'C:\\Downloads',
200
+ // ...省略其它默认参数
201
+ sortBy: (files) => {
202
+ return files.sorted((prev, next) => {
203
+ const prevBasename = getBasename(prev);
204
+ const nextBasename = getBasename(next);
205
+
206
+ return prevBasename.charCodeAt(0) - nextBasename.charCodeAt(0);
207
+ });
208
+ },
209
+ };
210
+ ```
211
+
212
+ #### format
213
+
214
+ format 参数可以对文件夹中的文件进行格式化,例如 C:\Downloads 中的文件如下:
215
+
216
+ - 01-start.mp4
217
+ - 02-龙珠-神秘的龙珠出现!.mp4
218
+ - 03-DRAGON_BOLL-FINAL_FIGHT.mkv
219
+ - 05-悟空变成了小孩.mov
220
+
221
+ 我们希望通过文件名的索引信息重命名,配置如下:
222
+
223
+ ```js
224
+ // renames.js 内部提供的功能函数
225
+ import stripNonDigit from '@yaohaixiao/renames.js/lib/utils/strip-non-digit';
226
+
227
+ export default {
228
+ dirPath: 'C:\\Downloads',
229
+ // ...省略其它默认参数
230
+ format: (basename) => {
231
+ return stripNonDigit(basename);
232
+ },
233
+ };
234
+ ```
235
+
236
+ ## License
237
+
238
+ Licensed under
239
+ [MIT License](http://opensource.org/licenses/mit-license.html).