🦕
denoで現在のディレクトリ以下にあるフォルダごとにzip圧縮するコードを書いてみた
お約束
この記事は medibaアドベントカレンダー 2021 2日目の記事です
medibaのテクノロジーセンターでネイティブアプリエンジニアをやっています、佐藤よしあきです
動機
色々とコード書き散らかしてると、ちょっとしたネタごとに作ったディレクトリでコード置き場が酷いことになりますよね
整理したいんだけどまとめてアーカイブしちゃうと検索できないので、せめてディレクトリ名では検索できるようにしたい→ディレクトリごとにzip作ればよくね?→標準のアーカイバで対応してるの少なくね?→じゃあ作るか
コレが
↓こうなる
せっかくなのでdenoで、denoさえあれば動く状態にしてみました
※ 元は Deno.exec()
でzip
を呼び出すとかいう剛毅な作りだった
コード
archiveEachDirectory.ts
// deno run --allow-read --allow-write archiveEachDirectory.ts
import { walk } from "https://deno.land/std/fs/mod.ts";
import { JSZip } from "https://deno.land/x/jszip/mod.ts";
for await (const dirEntry of Deno.readDir("./")) {
if (dirEntry.isDirectory == true && dirEntry.isSymlink == false) {
console.log(`zipping ${dirEntry.name} ....`);
const zip = new JSZip();
for await (const e of walk(dirEntry.name)) {
if (e.isFile) {
const binary = await Deno.readFile(e.path);
zip.addFile(e.path, binary, { binary: true, compression: `DEFLATE` });
console.log(`add file: ${e.path}`)
}
if (e.isDirectory) {
zip.folder(e.path);
console.log(`add directory: ${e.path}`)
}
}
console.log(`finalizing ${dirEntry.name}.zip ....`);
await zip.writeZip(`${dirEntry.name}.zip`);
console.log(`${dirEntry.name} archive -> ${dirEntry.name}.zip`);
}
}
メモ
最後の JSZip.writeZip()
がものすんごい遅いのは何が原因なんだろうか、JavaScriptだからだろうか
お約束
medibaでは事業の拡大や多角化に当たって、幅広い職種を募集中です
様々なフィールドがありますので、一度お話を聞きに来てみて下さい
Discussion