Home History Comparisons Examples Documentation Help File Download News Wish List Soapbox Project: Forums Tracker CVS Hosted by: Sourceforge VA Linux Author |
Hawk / Ftwalk Examples: ftduThis script provides an equivalent implementation of the UNIX du program in Ftwalk. The only change is that we've added a new option, -nN, which if specified only reports disk space for files that have been modified in the last N days. BEGIN { # get option switches from command line. the option switches are # single character flags, so each option switch string is separated # into characters which are tested in the switch statement. while (Opt = getopt) { for (i = 1; i <= Opt.length; i++) { switch (Opt.substr(i, 1)) { case "s": Summarize = true # only print totals for args case "a": AllFiles = true # print info for all files case "k": KBlocks = true # convert to 1024-byte blocks case "l": local # limit search to local machine case "m": mount # limit search to file system case "L": follow # follow symbolic links # new feature: if -n30 only summarize files changed # in last 30 days. number must be part of same option # string, not separated by space. case "n": MaxDays = float(Opt.substr(i + 1)); i = n default: die("unrecognized option: -%(Opt.substr(i, 1))\n" "usage: ftdu [-aklmsL] [path] ...") } } } # use depth-first search, so all files under a directory will be # summarized before the directory itself is handled. depth # allocate list for files with multiple links to guard against # reporting more than once. Links = list # change output field separator to tab OFS = "\t" } # print out the size and pathname of the current file. if file is a # directory the size is the accumulated size of all files under the # directory (collected under Space); otherwise the size is the size # of the file itself. function du_print() { if (isdir) Sz = Space[path] else if (MaxDays && mtime > MaxDays) return else Sz = sizeb # if -k option, convert 512-byte blocks to 1024-byte blocks. # divide by 2.0 and round up. if (KBlocks) Sz = ceil(Sz / 2.0) print(Sz, path) } # test/action pair checks for regular files with multiple hard links. # only count such files once. the Links list keeps track of all such # files seen so far. directories are not tested since the extra link # files (. and ..) are excluded by the file search algorithm. links > 1 && !isdir { # each file is uniquely identified by device/inode numbers Nm = sprintf("%d:%d", st_dev, st_ino) if (Nm in Links) next # already counted Links += Nm # add to list to catch further references } # test/action pair used by all files (except extra links skipped by # next above). the disk space used is added to the tally of each # parent directory, back to the original command line argument # (available in FILENAME). { Blks = (MaxDays && mtime > MaxDays) ? 0 : sizeb Nm = path if (isdir || Nm == FILENAME) Nm += "/Z" # add something for dirname to chop off do { Space[Nm = dirname(Nm)] += Blks } while (Nm != FILENAME) # output depends on option switch variables if (Summarize) { if (path == FILENAME) du_print } else { if (isdir || AllFiles) du_print } } |