Files
Knowledge/其他/nodejs zip 批量压缩文件夹 按需过滤文件 批量迁徙mv备份 shell bash.md
T

146 lines
4.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
## 安装依赖
$ npm i jszip os shelljs -S
## app.js
[](https://assets.cnblogs.com/images/copycode.gif)
// $ npm i jszip os shelljs -S
const fs = require('fs')
const { join, sep } = require('path')
const os = require('os')
const JSZIP = require('jszip')
const shell = require('shelljs')
const homedir = os.homedir()
const desktop = join(homedir, '/Desktop/')
// 调试神器
const debug = (...args) => (console.log(...args), args[args.length - 1])
// fixbug:shell 执行不支持 window \ 的格式。强制修复为 Linux / 格式
const exec = command => shell.exec(debug("—— DEBUG ——:", command.replace(/\\/g, '/')))
// 获取文件大小
const readSize = target => {
const size = fs.statSync(target).size
if (size < 1024) {
return size + ' kb'
} else {
return Math.floor(size / 1024) + ' mb'
}
}
// 我的压缩列表(TODO:抽离到独立的配置文件)
const zipList = [
join(desktop, 'dls-visual-12345'),
join(desktop, 'dls-micro-app'),
join(desktop, '我的ahk'),
join(desktop, 'pandora-cli'),
]
// 编译临时存储地址
const template_address = join(__dirname, 'template')
// fixbug: 还是这样最安全,毕竟要用 shell 执行地址
const allzip_address = join(template_address, '*.zip')
// 迁移地址
const migrate_address = join(desktop, '同步项目')
// 创建临时文件夹和同步专用文件夹
exec(`mkdir -p ${template_address} && mkdir -p ${migrate_address}`)
// 排除部分文件或文件夹
const exclude = name => !['.git', 'node_modules'].includes(name)
// zip 递归读取文件夹下的文件流
function readDir(zip, nowPath) {
// 读取目录中的所有文件及文件夹(同步操作)
let files = fs.readdirSync(nowPath)
//遍历检测目录中的文件
files.filter(exclude).forEach((fileName, index) => {
// 打印当前读取的文件名
false && console.log(fileName, index)
// 当前文件的全路径
let fillPath = join(nowPath, fileName)
// 获取一个文件的属性
let file = fs.statSync(fillPath)
// 如果是目录的话,继续查询
if (file.isDirectory()) {
// 压缩对象中生成该目录
let dirlist = zip.folder(fileName)
// (递归)重新检索目录文件
readDir(dirlist, fillPath)
} else {
// 压缩目录添加文件
zip.file(fileName, fs.readFileSync(fillPath))
}
})
}
// 开始压缩文件
function zipFolder({ target = __dirname, output = __dirname + '/result.zip' }) {
// 创建 zip 实例
const zip = new JSZIP()
// zip 递归读取文件夹下的文件流
readDir(zip, target)
// 设置压缩格式,开始打包
return zip.generateAsync({
// nodejs 专用
type: 'nodebuffer',
// 压缩算法
compression: 'DEFLATE',
// 压缩级别
compressionOptions: { level: 9, },
}).then(content => {
// 将打包的内容写入 当前目录下的 result.zip中
fs.writeFileSync(output, content, 'utf-8')
})
}
// demo
false && zipFolder({
// 目标文件夹
target: join(__dirname, 'test'),
// 输出 zip
output: __dirname + '/result.zip'
})
// 删除所有的 .zip
exec(`rm -rf ${allzip_address}`)
// 开始压缩
const workers = zipList.map(async target => {
// 获取文件名
const [name] = target.split(sep).reverse()
// zip 输出路径和文件名
const output = join(template_address, `${name}-${Date.now()}.zip`)
// 压缩目标文件夹
await zipFolder({ target, output })
// 获取压缩体积
const size = readSize(output)
// 打印成功信息
console.log(`☀️ ${name} 已压缩完成:`, output, ` (${size})`)
})
;(async () => {
// 等待任务完成
await Promise.all(workers)
// 开始批量迁徙
exec(`mv ${allzip_address} -t ${migrate_address}`)
})();
[](https://assets.cnblogs.com/images/copycode.gif)