ファイルの情報を得るには 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]);
})();