[node.js]ディレクトリを再帰的にたどってファイル一覧をJSONとして出力する
node.jsを使ってカレントディレクトリ以下を再帰的にたどりファイル一覧を出力します。(引数で対象となるディレクトリを指定できます)
ファイル名と共にファイルサイズも出力しています。
shimizu / filelist2json.js
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
var fs = require("fs") , path = require("path") , dir = process.argv[2] || '.'; //引数が無いときはカレントディレクトリを対象とする var walk = function(p, callback){ var results = []; fs.readdir(p, function (err, files) { if (err) throw err; var pending = files.length; if (!pending) return callback(null, results); //全てのファイル取得が終わったらコールバックを呼び出す files.map(function (file) { //リスト取得 return path.join(p, file); }).filter(function (file) { if(fs.statSync(file).isDirectory()) walk(file, function(err, res) { //ディレクトリだったら再帰 results.push({name:path.basename(file), children:res}); //子ディレクトリをchildrenインデックス配下に保存 if (!--pending) callback(null, results); }); return fs.statSync(file).isFile(); }).forEach(function (file) { //ファイル名を保存 var stat = fs.statSync(file); results.push({file:path.basename(file), size:stat.size}); if (!--pending) callback(null, results); }); }); } walk(dir, function(err, results) { if (err) throw err; var data = {name:'root', children:results}; console.log(JSON.stringify(data)); //一覧出力 }); |
実行
1 |
$ node filelist2json > data.json |
出力内容は以下のようになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
{ name:'root', children:[ name:'child_dir1' {file:'hoge1.txt', size:1111}, {file:'hoge2.txt', size:2222}, children:[ name:'child_dir2', {file:'hello1.txt', size:3333}, {file:'hello2.txt', size:4444} ] }, {file:'file1.txt', size:88888}, {file:'file2.txt', size:33333} } |
D3.jsに渡して使うために書いたスクリプトなのでちょっと特殊な形で出力しています。
上記データを基に作ったもの
サイズの大きなファイルを可視化する(ツリーマップ)