file-batch-toolkit 1.0.0
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.
- package/index.js +74 -0
- package/package.json +8 -0
package/index.js
ADDED
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// File Batch Toolkit Pro - Batch rename, resize, convert files
|
|
3
|
+
import fs from 'fs';
|
|
4
|
+
import path from 'path';
|
|
5
|
+
|
|
6
|
+
function help() {
|
|
7
|
+
console.log(`
|
|
8
|
+
File Batch Toolkit Pro v1.0.0
|
|
9
|
+
|
|
10
|
+
Usage:
|
|
11
|
+
batch rename <dir> --pattern "prefix_" Rename all files
|
|
12
|
+
batch resize <dir> --width 800 Resize images (requires sharp)
|
|
13
|
+
batch convert <dir> --to .md Convert .txt to .md
|
|
14
|
+
batch dedupe <dir> Find and remove duplicates
|
|
15
|
+
batch organize <dir> --by ext Sort into folders by type
|
|
16
|
+
batch help Show this help
|
|
17
|
+
`);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
async function main() {
|
|
21
|
+
const args = process.argv.slice(2);
|
|
22
|
+
const cmd = args[0] || 'help';
|
|
23
|
+
|
|
24
|
+
if (cmd === 'help') { help(); return; }
|
|
25
|
+
|
|
26
|
+
const dir = args[1];
|
|
27
|
+
if (!dir || !fs.existsSync(dir)) { console.error('Specify a valid directory'); return; }
|
|
28
|
+
|
|
29
|
+
if (cmd === 'rename') {
|
|
30
|
+
const pi = args.indexOf('--pattern');
|
|
31
|
+
const pattern = pi >= 0 ? args[pi + 1] : 'file_';
|
|
32
|
+
const files = fs.readdirSync(dir).filter(f => fs.statSync(path.join(dir, f)).isFile());
|
|
33
|
+
files.forEach((f, i) => {
|
|
34
|
+
const ext = path.extname(f);
|
|
35
|
+
const newName = `${pattern}${String(i + 1).padStart(3, '0')}${ext}`;
|
|
36
|
+
fs.renameSync(path.join(dir, f), path.join(dir, newName));
|
|
37
|
+
console.log(` ${f} → ${newName}`);
|
|
38
|
+
});
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
if (cmd === 'organize') {
|
|
43
|
+
const bi = args.indexOf('--by');
|
|
44
|
+
const by = bi >= 0 ? args[bi + 1] : 'ext';
|
|
45
|
+
const files = fs.readdirSync(dir).filter(f => fs.statSync(path.join(dir, f)).isFile());
|
|
46
|
+
files.forEach(f => {
|
|
47
|
+
const ext = path.extname(f).slice(1).toLowerCase() || 'no_ext';
|
|
48
|
+
const subDir = path.join(dir, ext);
|
|
49
|
+
if (!fs.existsSync(subDir)) fs.mkdirSync(subDir);
|
|
50
|
+
fs.renameSync(path.join(dir, f), path.join(subDir, f));
|
|
51
|
+
});
|
|
52
|
+
console.log(` Organized ${files.length} files`);
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
if (cmd === 'dedupe') {
|
|
57
|
+
const files = fs.readdirSync(dir).filter(f => fs.statSync(path.join(dir, f)).isFile());
|
|
58
|
+
const seen = new Map();
|
|
59
|
+
let removed = 0;
|
|
60
|
+
files.forEach(f => {
|
|
61
|
+
const fp = path.join(dir, f);
|
|
62
|
+
const size = fs.statSync(fp).size;
|
|
63
|
+
if (seen.has(size)) {
|
|
64
|
+
fs.unlinkSync(fp); removed++;
|
|
65
|
+
} else { seen.set(size, f); }
|
|
66
|
+
});
|
|
67
|
+
console.log(` Found ${removed} duplicates, removed`);
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
help();
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
main().catch(console.error);
|