chip@tct.uucp (Chip Salzenberg) (03/02/91)
J. Palkovic recently posted a shell script that detects and removes recently received articles with old dates. That script works fine. It even uses a program I wrote ("header"). But it's quite slow; it invokes the "header" and "getdate" programs once for each article. The Perl script below, "oldarts", finds the Date: header on its own, and each invocation of "getdate" interprets 100 date strings. It is therefore fast enough that I don't mind running it daily. Shar and enjoy. #! /bin/sh # This is a shell archive. Remove anything before this line, then unpack # it by saving it into a file and typing "sh file". To overwrite existing # files, type "sh file -c". You can also feed this as standard input via # unshar, or by typing "sh <file", e.g.. If this archive is complete, you # will see the following message at the end: # "End of shell archive." # Contents: oldarts # Wrapped by chip@tct on Fri Mar 1 11:50:13 1991 PATH=/bin:/usr/bin:/usr/ucb ; export PATH if test -f 'oldarts' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'oldarts'\" else echo shar: Extracting \"'oldarts'\" \(2339 characters\) sed "s/^X//" >'oldarts' <<'END_OF_FILE' Xeval 'exec /bin/perl -S $0 ${1+"$@"}' X if 0; X X# $Id: oldarts,v 1.1 1991/03/01 16:28:09 news Exp $ X# X# Print on standard output the names of new news articles X# with old Date: headers. X# X# Chip Salzenberg 3/1/91. X# Based on an idea by J. Palkovic. X# X# $Log: oldarts,v $ X# Revision 1.1 1991/03/01 16:28:09 news X# Initial revision X# X X#---------------------------------------------------------------- X# Configuration -- edit these values. X# X X$NEWSLIB = "/u/news/lib"; X$NEWSBIN = "/u/news/cbin"; X$NEWSSPOOL = "/u/news/spool"; X$ENV{"PATH"} = "$NEWSBIN:/u/local/bin:/usr/bin:/bin"; X$RECENT = 7; X$OLD = 14; X X#---------------------------------------------------------------- X# Setup. X# X X($ME = $0) =~ s#^.*/##; X Xchdir $NEWSSPOOL || die "$ME: $NEWSSPOOL: $!\n"; X X$now = time; X$limit = $now - &DAYS($OLD); X X#---------------------------------------------------------------- X# Generate names of all recent articles, that is, X# articles that have arrived within the last week. X# X Xopendir(NS, ".") || die "$ME: $NEWSSPOOL: can't read '.'\n"; X@hier = grep(!/\./, readdir(NS)); Xclosedir(NS); Xopen(FIND, "find @hier -mtime -$RECENT -name '[0-9]*' -type f -print |"); Xwhile (<FIND>) { X chop; X push(@F, $_); X &check(*F) if @F >= 100; X} Xclose(FIND); X&check(*F) if @F; Xexit; X X#---------------------------------------------------------------- X# Check all filenames in the array with the given symbol table X# entry. Automatically truncates the array. X# X Xsub check { X local(*f) = @_; X local(@d) = (); X X # Generate an array @d parallel to @f, containing the X # date strings for the given files, or "missing" if none. X X for $f (@f) { X $date = "missing"; X if (open(f, $f)) { X while (<f>) { X last if /^$/; X ($date = $1, last) if /^Date:\s+(.*)$/; X } X close(f); X } X push(@d, $date); X } X X # Use the C News "getdate" program to translate date strings X # to numeric values. Print files with old dates. X X die "$ME: getdate: $!\n" unless defined($pid = open(GD, "-|")); X if ($pid == 0) { X open(STDERR, ">&STDOUT"); X exec "getdate", @d; X print STDERR "$ME: getdate: $!\n"; X exit 1; X } X while (<GD>) { X last unless defined($f = shift(@f)); X if (/^(\d+)$/) { X print $f, "\n" if $_ < $limit; X } X else { X print STDERR "$ME: $f: ", $_; X } X } X close(GD); X X # Truncate the caller's array, and return. X X @f = (); X 1; X} X Xsub DAYS { X $_[0] * 86400; X} END_OF_FILE if test 2339 -ne `wc -c <'oldarts'`; then echo shar: \"'oldarts'\" unpacked with wrong size! fi chmod +x 'oldarts' # end of 'oldarts' fi echo shar: End of shell archive. exit 0 -- Chip Salzenberg at Teltronics/TCT <chip@tct.uucp>, <uunet!pdn!tct!chip>