last update: Dec. 5 1997

ディレクトリの占有率を表示するツール (REXX)


初めてまともなツールと呼べそうなものができました. (^_^;)


/*
  show directory size/ratio DIRSZ.CMD
  copyright(c) ark@dan.wind.ne.jp
*/

options 'EXMODE'

parse arg lvl dir

call RxFuncAdd 'SysLoadFuncs', 'RexxUtil', 'SysLoadFuncs'
call SysLoadFuncs

if dir = '' then do
/* レベル指定のないとき */
    dir = lvl
    lvl = 9999
end

numeric digits 12
dirstem.0 = 0            /* ディレクトリ数の初期化 */
sum = dirsize( '0', dir )    /* 指定ディレクトリ以下のサイズの計算 */

do i = 1 to dirstem.0
    parse var dirstem.i lv sz dsz dnum dname
    if lv <= lvl then do
    /* 指定されたレベルより上 */
        rsz = sz / sum * 100
        rds = dsz / sum * 100
        /* LONGNAMEのとりだし */
        if SysGetEA( dname, '.LONGNAME', 'eainfo' ) = 0 then
            if eainfo = '' then
                lname = filespec('Name', dname)
            else
                parse var eainfo 5 lname
        else
            lname = filespec('Name', dname)
        say format(sz,10)' / 'format(dsz,10)' ('format(rsz,3,2)'%/'format(rds,3,2)'%)'copies(' |',lv) lname
    end
end
return

/* 再帰的にディレクトリのサイズを計算するプロシージャ */
/*   パラメータ:現在のレベル, ディレクトリ名 */
dirsize: procedure expose dirstem.
parse arg lv, dir

dirstem.0 = dirstem.0 +1    /* ディレクトリ数+1 */
dirnum = dirstem.0
ret = 0
if SysFileTree( dir'\*', fstem, 'DO' ) = 0 then do
/* サブディレクトリの検索 */
    dnum = fstem.0
    subsum = 0        /* サブディレクトリのサイズを初期化 */
    do i = 1 to dnum
        sz = dirsize( lv+1, fstem.i )    /* 子ディレクトリのサイズを計算 */
        subsum = subsum + sz        /* サイズを加算 */
    end
end
else do
    say 'file serach error!'
    dnum = 0
end

if SysFileTree( dir'\*', fstem, 'FT' ) = 0 then do
/* ファイルの検索 */
    szsum = 0        /* ファイルサイズを初期化 */
    do i = 1 to fstem.0
        parse var fstem.i tm sz at nm    /* ファイルサイズの取りだし */
        szsum = szsum + sz        /* サイズを加算 */
    end
end
else do
    say 'file serach error!'
end

ret = subsum + szsum
dirstem.dirnum = lv' 'szsum' 'ret' 'dnum' 'dir    /* 各種情報の記録 */
return ret

すでに私にも説明できなくなってしまってるっす (^_^;) . コメントを元に解析してみてください. ひねくれた作りには なってないはずなんで. あ... dirstem の使い方は ひねくれてるかも (^_^;) .

このコマンドの使い方は,
DIRSZ lv dir
で, lvは表示するサブディレクトリのレベル, dirは表示するディレクトリ名です. なお, レベルは省略可能で, 省略した場合はすべてのサブディレクトリを表示します.



このページの作者は αρκ <ark@dan.wind.ne.jp> です