48 lines
1.7 KiB
JavaScript
48 lines
1.7 KiB
JavaScript
// sorts images
|
|
// Take the file name `2336p68.png`, which is a Lego "Cockpit Space Nose",
|
|
// after a simple MD5 hash, the result is:
|
|
|
|
// ```text
|
|
// "d2ef319ea58566b55070e06096165cb8"
|
|
// ^^^^
|
|
// ```
|
|
|
|
// Using the first four characters in the hash, we can allocate images
|
|
// into buckets for storage and quick retreval. This acts very similar
|
|
// to a hash table implemented in the filesystem.
|
|
|
|
const md5 = require('md5');
|
|
const fs = require('fs');
|
|
|
|
fs.readdir('./image/', (err, files) => {
|
|
files.forEach((file) => {
|
|
file = file.split('.png')[0];
|
|
const hash = md5(file);
|
|
const bucket = hash.substring(0, 4);
|
|
const newFile = `./image/${bucket[0]}/${bucket[1]}/${bucket[2]}/${bucket[3]}/${file}.png`;
|
|
|
|
// if directory doesn't exist, create it
|
|
if (!fs.existsSync(`./image/`)) {
|
|
fs.mkdirSync(`./image/`);
|
|
}
|
|
if (!fs.existsSync(`./image/${bucket[0]}/`)) {
|
|
fs.mkdirSync(`./image/${bucket[0]}/`);
|
|
}
|
|
if (!fs.existsSync(`./image/${bucket[0]}/${bucket[1]}/`)) {
|
|
fs.mkdirSync(`./image/${bucket[0]}/${bucket[1]}/`);
|
|
}
|
|
if (!fs.existsSync(`./image/${bucket[0]}/${bucket[1]}/${bucket[2]}/`)) {
|
|
fs.mkdirSync(`./image/${bucket[0]}/${bucket[1]}/${bucket[2]}/`);
|
|
}
|
|
if (!fs.existsSync(`./image/${bucket[0]}/${bucket[1]}/${bucket[2]}/${bucket[3]}/`)) {
|
|
fs.mkdirSync(`./image/${bucket[0]}/${bucket[1]}/${bucket[2]}/${bucket[3]}/`);
|
|
}
|
|
|
|
fs.rename(`./image/${file}.png`, newFile, (err) => {
|
|
if (err) {
|
|
console.log(err);
|
|
}
|
|
});
|
|
});
|
|
});
|