bigfiles - list the largest files under these directories
Name
bigfiles - list the largest files
under these directories
Syntax
bigfiles [-nn] [directory...]
Description
Bigfiles recursively
scans directory for file sizes, keeping track of
the biggest files. At the end of
the scan, it wites the size and file
names of the biggest nn files.
Arguments
-nn Limit the listing
to the biggest nn files (100 is the default and
maximum)
-s Restrict search to the same
file system as first directory.
directory Examine these
directories. Several may be specified. If no
directories are
specified, filenames are read from stdin. This allows
input to be piped from a program
such as find.
Example
$ bigfiles -5 .
1306624
./ULTRIX/dxuil
989488 ./ULTRIX/docclient
372736 ./ULTRIX/xviewgl
278528 ./ULTRIX/sc
106470 ./sun4c/xanim
$ /bin/ls *~ | bigfiles
3061 recent.c~
2003 tree.c~
962 ingwho~
707 diskinfo~
401 dstats~
258 do_sum.c~
248 rgrep~
54 mif2txt~
See Also
stat(2)
Known Bugs
The switch handling doesn't allow
piped filenames and a limit on the
number of files reported.
Only regular files are considered.
Author
David Horton - CiTR
Copyright
Centre for Information Technology
Research, 1993
/* Bigfiles - finds the large
files on a system.
If no arguments are provided, then filenames are
read from standard input
otherwise, the arguments are considered to be
directory names
David Horton,
Centre for Information Technology Research,
University of Queensland
horton@citr.uq.oz.au
*/
#include <stdio.h>
#define _INCLUDE_POSIX_SOURCE /*
HP/UX */
#include <sys/types.h>
#define _INCLUDE_HPUX_SOURCE
/* HP/UX */
#define _INCLUDE_XOPEN_SOURCE /*
HP/UX */
#include <sys/stat.h>
#include <memory.h>
#include <dirent.h>
#define MF 200
#define FNLEN 2000
#if !defined(S_ISLNK)
# define S_ISLNK(_M) ((_M & S_IFMT)==S_IFMT) /*
test for symbolic link */
#endif
#include <stdlib.h>
#ifdef void
#error
#endif
#ifdef gets
#undef gets
#endif
#define gets(b) fgets(b, sizeof(b), stdin)
struct context { /* context
we need to keep for a possibly big file */
off_t size;
char
name[FNLEN];
};
struct context c[MF]; /* array of biggest files so far,
sorted */
char device_mode = '\0'; /* s
means will be only one device,
S means device set */
dev_t device =
0;
/* the device number */
#ifdef __STDC__
void big (off_t st_size, char *fname)
{ /* see if this is a big file */
#else
void big (st_size, fname) /* see if this is a
big file */
off_t st_size; char *fname; { /* see if this is a big file */
#endif
int i;
/*printf("big(%d,%s)\n", (int)
st_size, fname); */
for (i = MF-1; i >= 0; i--)
{ /* starting from the smallest we
have*/
if (c[i].size >=
st_size) /* see if
bigger
*/
break;
else {
if (
i != (MF-1)) { /* if it
is shuffle into place */
c[i+1].size = c[i].size;
memcpy(c[i+1].name,c[i].name,sizeof(c[i].name));
}
}
}
if ( i != MF-1)
{
/* final test for top of the tree */
c[i+1].size = st_size;
memcpy(c[i+1].name,fname,sizeof(c[i+1].name));
}
}
#if defined(__STDC__)
void tree(char *root)
{
/* Process a unix directory instead of*/
#else
void
tree(root)
/* Process a unix directory instead of*/
char *root;
{
/* Process a unix directory instead of*/
#endif
DIR
*dirp;
/* a list of filenames on stdin */
struct dirent *dp;
struct stat s;
char
buf[FNLEN];
/*printf("tree(%s)\n", root); */
dirp =
opendir(root);
/* Open the top of the directory tree */
if (dirp == NULL) {
perror(root);
return; /* Cannot open
*/
}
while ((dp = readdir(dirp))
!= NULL) { /*process entries in directory*/
if ( strcmp(dp->d_name, ".") == 0)
continue;
/* don't go infinite */
if ( strcmp(dp->d_name, "..") == 0)
continue;
/* don't go up */
sprintf(buf,"%s/%s", root, dp->d_name);
if (lstat(buf,&s)) {
continue; /* no data available */
}
switch (device_mode) {
case 's':
device = s.st_dev;
device_mode = 'S';
break;
case 'S':
if (s.st_dev != device) {
continue;
}
break;
default:
break;
}
if (S_ISLNK(s.st_mode))
continue; /* don't follow symbolic
links */
if (S_ISDIR(s.st_mode)) { /* go down sub-tree */
tree(buf);
}
if (!S_ISREG(s.st_mode)) { /* only look at regular files */
continue;
}
big(s.st_size,
buf);
/* see if big file or not */
}
(void) closedir(dirp);
}
static char Copyright[] = "@(#) Copyright 1994, David Horton";
static char rcs[] = "@(#)$RCSfile$ $Revision$";
#if defined(__STDC__)
void main(int argc, char *argv[]) {
#else
main(argc, argv)
int argc; char *argv[]; {
#endif
struct
stat s;
char
fname[FNLEN];
/* buffer for filename */
char *fn;
int
i;
int
many = MF;
int
dirs = 0;
memset(c, 0, sizeof(c));
if (argc == 1)
{ /*
no args -> read filenames from stdin */
while ( (fn = gets(fname)) != NULL) {
s.st_size = 0;
if (lstat(fname,&s)) {
continue; /* no data available */
}
if
(!S_ISREG(s.st_mode)) { /* only look at regular files */
continue;
}
big(s.st_size, fname);
}
} else
{
/* otherwise a list of directory heads */
for
(i = 1; i < argc; i++) {
if (argv[i][0] == '-') {
switch(argv[i][1]) {
case 's': case 'S':
device_mode = 's';
break;
case 'h':
fprintf(stderr,
"Usage: %s [-h] [-v] [-s] [directory]...\n",argv[0]);
exit(0);
break;
case 'v':
fprintf(stderr, "%s : %s\n",argv[0], Copyright);
fprintf(stderr, "%s\n", rcs);
exit(0);
break;
default:
many = - atoi(argv[i]);
if ((many ==0) || (many > MF))
many = MF;
continue;
}
}
tree(argv[i]);
dirs ++;
}
}
for( i=0; i < many; i++) {
if (c[i].size == 0) break;
printf("%10d %s\n",(int)c[i].size,c[i].name);
}
exit (0);
}