Macで変更日を基準としたファイルのナンバリング処理をNode.jsでやってみた
ファイルの情報を得るには fs.stat
を使う。
mtimeMs
を基準としたソートを行い、同じサイズのファイルが連続していれば削除まで行う。
ファイルの同一性はチェックしていないので、削除が嫌な場合は reduce
句を削除すればいい。
桁数を間違えると上書きしやがるので注意しよう。
forEach
じゃなく for...of
を使用したほうが安定すると思う。
const fs = require('fs/promises');
const path = require('path');
const { program } = require('commander');
program
.name('file numbering')
.description('ファイルをナンバリングします')
.argument('<string>', '対象ディレクトリ')
.option('-d, --digit <number>', 'ページの桁数', 2)
.version('0.0.1');
program.parse();
const options = program.opts();
const digit = options.digit;
if (!program.args[0]) {
console.error('引数にディレクトリパスが必要です。');
return;
}
async function main(dirname) {
let files = await fs.readdir(dirname);
files = await Promise.all(files.map(async (filename) => {
let s = await fs.stat(path.join(dirname, filename));
return {
name: filename,
time: s.mtimeMs,
size: s.size
};
}))
files = files
.sort((a, b) => a.time - b.time)
.reduce((acc, cur) => {
if (acc.before_size != cur.size && cur.size > 0) {
acc.list.push(cur);
}
acc.before_size = cur.size;
return acc;
}, { list: [], before_size: -1 })
.list
.map((v) => v.name);
files.forEach(async (filename, index) => {
let src = path.join(dirname, filename);
let dst = path.join(dirname, ("0".repeat(digit - 1) + (index + 1)).slice(-digit) + path.extname(filename));
try {
await fs.access(dst);
console.log(`${dst} is already exists.`);
} catch (error) {
await fs.rename(src, dst);
}
});
}
(async () => {
await main(program.args[0]);
})();