Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 20 Jan 2005 15:46:08 +0100
From:      David Landgren <david@landgren.net>
To:        stable@freebsd.org
Subject:   Re: Very large directory
Message-ID:  <41EFC430.9010308@landgren.net>
In-Reply-To: <20050120094551.GK79646@cirb503493.alcatel.com.au>
References:  <00b001c4fea0$7533d490$6745a8c0@MESE> <20050120094551.GK79646@cirb503493.alcatel.com.au>

next in thread | previous in thread | raw e-mail | index | archive | help
Peter Jeremy wrote:
> On Wed, 2005-Jan-19 21:30:53 -0600, Phillip Salzman wrote:
> 
>>They've been running for a little while now - and recently we've noticed a
>>lot of disk space disappearing.  Shortly after that, a simple du into our
>>/var/spool returned a not so nice error:
>>
>>	du: fts_read: Cannot allocate memory
>>
>>No matter what command I run on that directory, I just don't seem to have
>>enough available resources  to show the files let alone delete them (echo *,
>>ls, find, rm -rf, etc.)
> 
> 
> I suspect you will need to write something that uses dirent(3) to scan
> the offending directory and delete (or whatever) the files one by one.
> 
> Skeleton code (in perl) would look like:
> 
> chdir $some_dir or die "Can't cd $some_dir: $!";
> opendir(DIR, ".") or die "Can't opendir: $!";
> while (my $file = readdir(DIR)) {
> 	next if ($file eq '.' || $file eq '..');
> 	next if (&this_file_is_still_needed($file));
> 	unlink $file or warn "Unable to delete $file: $!";
> }
> closedir DIR;

similarly,

opendir(DIR, $some_dir ) or die "Can't open dir $some_dir: $!";
while ( defined(my $file = readdir(DIR))) {
     print "$file\n" unless ($file eq '.' || $file eq '..');
}
closedir(DIR);

...will print the files one per line, which can be piped to more or 
redirected to another file. This will let you get a feel for the names 
of the files in the directory. It could then be cleaned up with various 
pipelines like egrep 'foo|bar|rat' | xargs rm

Note: you want to wrap the my $file = readdir(DIR) in a defined(), 
otherwise your loop will exit early if you come across a file named 0 
(zero).

David



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?41EFC430.9010308>