96 lines
3.2 KiB
JavaScript
96 lines
3.2 KiB
JavaScript
#! /usr/bin/env runjs
|
|
|
|
var argsjs = require('component-args.js');
|
|
|
|
var parseSize = (s) => {
|
|
if (s == null) { return $$.num(0); }
|
|
s = s.toLowerCase();
|
|
if (!(/^\d+[kmg]?$/i.test(s))) {
|
|
throw 'Size format error: ' + s;
|
|
}
|
|
if (s.endsWith('k')) {
|
|
return $$.num(s.substring(0, s.length - 1)).mul(1024);
|
|
}
|
|
if (s.endsWith('m')) {
|
|
return $$.num(s.substring(0, s.length - 1)).mul(1024).mul(1024);
|
|
}
|
|
if (s.endsWith('g')) {
|
|
return $$.num(s.substring(0, s.length - 1)).mul(1024).mul(1024).mul(1024);
|
|
}
|
|
return $$.num(s);
|
|
};
|
|
|
|
var main = () => {
|
|
var args = argsjs.parseDefARGs(['h', 'help']);
|
|
if ((args.flg('h', 'help')) || (args.length == 0)) {
|
|
println('split.js <file.ext>');
|
|
println(' -h, --help Print help');
|
|
println(' -s, --size File size(default 20m)');
|
|
println(' -p, --prefix File prefix(default filename + ".")');
|
|
println(' --suffix File suffix(default "")');
|
|
return;
|
|
}
|
|
var file = $$.file(args[0]);
|
|
if (!file.exists()) {
|
|
xprintln('[ERROR] File not exists: ' + file);
|
|
return;
|
|
}
|
|
var size = parseSize(args.val('s', 'size') || '20m');
|
|
xprintln('[INFO] Split size: ' + size);
|
|
|
|
if (size.compareTo(0) < 0) {
|
|
xprintln('[ERROR] Split file size cannot less than 0: ' + size);
|
|
return;
|
|
}
|
|
if (size.compareTo(file.length()) >= 0) {
|
|
xprintln('[ERROR] Split file size larger or equals then origin file, ' + size + ' vs ' + file.length());
|
|
return;
|
|
}
|
|
|
|
var prefix = args.val('p', 'prefix') || file.getName();
|
|
if (!prefix.endsWith('.')) { prefix += '.'; }
|
|
xprintln('[INFO] Split file prefix: ' + prefix);
|
|
var suffix = args.val('suffix') || '';
|
|
if (!suffix.startsWith('.') && ($STR(suffix) != '')) { suffix = '.' + suffix; }
|
|
xprintln('[INFO] Split file suffix: ' + (($STR(suffix) == '') ? '(empty)' : suffix));
|
|
|
|
var fileIndex = 0;
|
|
var writted = $$.num(0);
|
|
var buff = $$.byteArray(1024);
|
|
|
|
var fnList = [];
|
|
var fn = prefix + $$.numFormat('000').format(fileIndex) + suffix;
|
|
if ($$.file(fn).exists()) {
|
|
xprintln('[ERROR] File exists: ' + fn);
|
|
return;
|
|
}
|
|
|
|
fnList.push(fn);
|
|
xprintln('[INFO] Write file: ' + fn);
|
|
var os = new java.io.BufferedOutputStream(new java.io.FileOutputStream($$.file(fn)));
|
|
var is = $$.rFile(file).rStream().buffered().stream();
|
|
for (var len; ((len = is.read(buff)) != -1);) {
|
|
os.write(buff, 0, len);
|
|
writted = writted.add(len);
|
|
if (writted.compareTo(size.mul(fileIndex + 1)) >= 0) {
|
|
os.close();
|
|
fileIndex++;
|
|
if (writted.compareTo(file.length()) < 0) {
|
|
fn = prefix + $$.numFormat('000').format(fileIndex) + suffix;
|
|
fnList.push(fn);
|
|
xprintln('[INFO] Write file: ' + fn);
|
|
os = new java.io.BufferedOutputStream(new java.io.FileOutputStream($$.file(fn)));
|
|
} else {
|
|
os = null;
|
|
}
|
|
}
|
|
}
|
|
if (os != null) { os.close(); }
|
|
println();
|
|
xprintln('[OK] Use command to join file:\ncat ' + fnList.join(' \\\n ') + ' \\\n > ' + file.getName());
|
|
println();
|
|
xprintln('[INFO] Split file done!');
|
|
};
|
|
|
|
main();
|