Adrian von Bidder wrote:
> find "$BACKUP_DIR/arc" -name '*.arc' -printf '%A@:%p\n' \
>       | sort -g  -t : \
>       | cut -d : -f 2- \
>       | head -n "$NUM_OF_FILES" \
>       | xargs -r rm -f
> 

Another option might be to re-cast the problem a bit. If you're just 
trying to keep the number of files in the directory under control, and 
don't specifically need to keep the NUM_OF_FILES most recent files, 
the idea of keeping files that are newer than a certain age fits 
"find" a bit more cleanly.  For instance

     find . -type f -name '*.arc' -not -amin 86400 -print \
         | xargs -r rm -f

would be "delete any arc files that haven't been accessed in the last 
24 hours".

> If somebody wants to do some clever scripting: I have a similar need,
> but not yet found a simple solution: I want to purge some cache
> directory and just leave the most recently accessed k megabytes. File
> sizes vary greatly, so file count won't help much.

There's probably a nice, elegant way to do this one in shell script, 
but I'd be tempted to just throw it over to Perl. Warning: this script 
will break if the list of file names gets too big to hold in memory:

#!/usr/bin/perl -w

use strict;

# print usage
if ($#ARGV != 1) {
     print "usage: $0 <directory> <megabytes>\n";
     exit 1;
}

# get files from directory
if (! opendir DIR, "$ARGV[0]") {
     die "couldn't open directory $ARGV[0]";
}
my @fileNames = readdir DIR;
closedir DIR;

# get file sizes and access times
my @fileInfo;
my $BYTES_PER_MB = 1024 * 1024;
my $ACCESS_IDX = 8; # see "stat" in man perlfunc
foreach my $file (@fileNames) {
     my $fullName = "$ARGV[0]/$file";
     if (-f "$fullName") {
         my @stat = stat "$fullName";
         push @fileInfo, [$fullName, $stat[$ACCESS_IDX],
                          $stat[7] / $BYTES_PER_MB];
     }
}
@fileNames = ();

# sort by access time, most recent first
@fileInfo = sort {$b->[1] <=> $a->[1]} @fileInfo;

# Once the number of megabytes of accessed files exceeds
# the command line parameter, print the file names.
my $totMB = 0;
foreach my $info (@fileInfo) {
     $totMB += $info->[2];
     if ($totMB > $ARGV[1]) {
         print "$info->[0]\n";
     }
}

Hope this helps!

- Jeff


-- 
To UNSUBSCRIBE, email to [EMAIL PROTECTED] 
with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]

Reply via email to