last update: Dec. 5 1997
初めてまともなツールと呼べそうなものができました. (^_^;)
/*
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は表示するディレクトリ名です.
なお, レベルは省略可能で, 省略した場合はすべてのサブディレクトリを表示します.