clipper@no9sun.csd.uwo.ca (Khun Yee Fung) (11/06/90)
This is the package I used to scan a directory to do things to files and directories recursively. I have never liked the syntax find(1). So I used this to do compressdir(1) and uncompressdir(1). It is about 100% faster than the find(1) based compressdir(1) and uncompressdir(1) on our machine. It uses a breadth first search; might not be useful for your purposes. Send your comments to clipper@csd.uwo.ca. Thanks. Khun Yee clipper@csd.uwo.ca #! /bin/sh # This is a shell archive, meaning: # 1. Remove everything above the #! /bin/sh line. # 2. Save the resulting text in a file. # 3. Execute the file with /bin/sh (not csh) to create the files: # dir.pl # cdir # if test -f 'dir.pl' then echo shar: will not over-write existing file "'dir.pl'" else echo x - 'dir.pl' sed 's/^X//' >'dir.pl' << 'SHAR_EOF' X#-*-perl-*- X# X# copyright (c) 1990 Khun Yee Fung <clipper@csd.uwo.ca> X# See the end of this file for warranty information X# X# [I don't know nroff and don't intend to learn it. Anybody intends to X# write a manual page style for LaTeX with a tex-to-ascii driver?] X# X# How to use this package: X# &dodir($dir, $file, $directory) X# The result is the set of error messages obtained when executing $dir X# on all the directories found, and $file on all the files found in X# the directory $directory, recursively. The directory or file found X# is in $FILE. X# X# For example, to compress all files in a directory $ARGV[0]: X# X# require 'dir.pl'; X# X# $f = "if (\$FILE !~ /\\.Z\$/) { X# system(\"compress \$FILE\"); X# }"; X# $d = ''; X# $, = "\n"; X# print &dodir($d, $f, $ARGV[0]); X# X Xpackage scandir; X Xsub main'dodir { X local($d, $f, $argv) = @_; X X if (!defined($argv)) { X return @a = ("No argument"); X } X if ($argv eq '.') { X opendir($dir, "."); X @files = readdir($dir); X closedir($dir); X foreach $file (@files) { X push(@FILES, "./$file"); X } X } X elsif ($argv eq '..') { X opendir($dir, ".."); X @files = readdir($dir); X closedir($dir); X foreach $file (@files) { X push(@FILES, "../$file"); X } X } X else { X push(@FILES, $argv); X } X select(STDOUT); $| = 1; X while ($FILE = shift(@FILES)) { X next if ($FILE eq '..' || $FILE eq '.' || $FILE =~ m-.*/\.\.- || X $FILE =~ m-.*/\.-); X @stat = lstat($FILE); X $type = $stat[2] & 0170000; X if ($type == 040000) { X # found a directory X if (!opendir(DIR, $FILE)) { X push (@a, "Can't open $FILE"); X } X else { X eval $d; X if ($@ ne '') { X push(@a, "[$FILE]:$@"); X } X @files = readdir(DIR); X closedir(DIR); X foreach $file (@files) { X push(@FILES, "$FILE/$file"); X } X } X } X elsif ($type == 0100000) { X # a regular file X eval $f; X if ($@ ne '') { X push(@a, "[$FILE]:$@"); X } X } X } X @a; X} X1; X X__END__ X X# Copyright 1990 Khun Yee Fung <clipper@csd.uwo.ca> X# X# Permission to use, copy, modify, and distribute, this software and its X# documentation for any purpose is hereby granted without fee, provided that X# the above copyright notice appear in all copies and that both that X# copyright notice and this permission notice appear in supporting X# documentation, and that the name of the copyright holder be used in X# advertising or publicity pertaining to distribution of the software with X# specific, written prior permission, and that no fee is charged for further X# distribution of this software, or any modifications thereof. The copyright X# holder makes no representations about the suitability of this software for X# any purpose. It is provided "as is" without express or implied warranty. X# X# THE COPYRIGHT HOLDER DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, X# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO X# EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY SPECIAL, INDIRECT OR X# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, X# DATA, PROFITS, QPA OR GPA, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE X# OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR X# PERFORMANCE OF THIS SOFTWARE. SHAR_EOF if test 3214 -ne "`wc -c < 'dir.pl'`" then echo shar: error transmitting "'dir.pl'" '(should have been 3214 characters)' fi fi if test -f 'cdir' then echo shar: will not over-write existing file "'cdir'" else echo x - 'cdir' sed 's/^X//' >'cdir' << 'SHAR_EOF' X#!/usr2/new/bin/perl -*-perl-*- X Xrequire 'dir.pl'; X X$f = "if (\$FILE !~ /\\.Z\$/) { X system(\"compress \$FILE\"); X }"; X$d = ''; X$, = "\n"; Xprint &dodir($d, $f, $ARGV[0]); SHAR_EOF if test 218 -ne "`wc -c < 'cdir'`" then echo shar: error transmitting "'cdir'" '(should have been 218 characters)' fi fi echo Done exit 0 -- ---- In Real life: Khun Yee Fung clipper@csd.uwo.ca (Internet) Alternative: 4054_3267@UWOVAX.BITNET UUCP: ...!{ihnp4|decvax|seismo}!{watmath|utzoo}!ria!csd!clipper Department of Computer Science Middlesex College The University of Western Ontario London, Ontario, N6A 5B7 CANADA