The good thing about
compressing files (24.7
)
is that it saves disk space.
The bad thing is that
if there are lots of compressed files you want to access separately,
typing all those gzcat
(or zcat
)
commands can get tedious and waste time.
I wrote a script named zloop
that takes a command you want to run
and a list of compressed files.
It runs gzcat
on each file, separately, and pipes each gzcat
output to the command you gave.
Because gzcat
also understands compress
format, it can
handle .Z
files too.
The script shows the command line it ran and the output (if any) of the
command.
If the command returned
nonzero status (44.7
)
,
zloop
prints a warning.
% ls
185.gz 187.gz 189.gz 191.gz 193.gz 195.gz 197.gz
186.gz 188.gz 190.gz 192.gz 194.gz 196.gz 198.gz
% zloop 'egrep "^Subject:.*group"' *.gz
==== zloop: zcat 185.gz | egrep "^Subject:.*group" ====
Subject: List of Active Newsgroups
==== zloop: zcat 186.gz | egrep "^Subject:.*group" ====
Subject: Alternative Newsgroup Hierarchies
==== zloop: zcat 187.gz | egrep "^Subject:.*group" ====
zloop: note: that command returned 1 (non-zero) status:
'/usr/local/bin/gzcat 187.gz | egrep "^Subject:.*group"'
==== zloop: zcat 188.gz | egrep "^Subject:.*group" ====
Subject: Checkgroups message (with INET groups)
Subject: Checkgroups message (without INET groups)
Subject: Monthly checkgroups posting
...
zloop
is sort of verbose for a UNIX command - but you can make it
quieter by editing the script.
The status messages are sent to standard error.
So,
if you want to send zloop
output through a pager like
more
, tell the shell to merge standard output and standard error:
|&
2>&1
|
.\
% zloop 'egrep "^Subject:.*group"' *.gz |& more
csh
$ zloop 'egrep "^Subject:.*group"' *.gz 2>&1 | more
sh
|
With a plain pipe (|
), status messages and command output can be
jumbled (13.4
)
.
In case it isn't clear: when you redirect the output of zloop
,
you're redirecting the output of all the commands that zloop
runs - i.e., typing this command:
tr
-2
|
% zloop 'tr "[A-Z]" "[a-z]" | pr -2' *.gz > toprint
|
is like typing these commands by hand:
(
|
( gzcat file1
.gz | tr "[A-Z]" "[a-z]" | pr -2
gzcat file2
.gz | tr "[A-Z]" "[a-z]" | pr -2
gzcat file3
.gz | tr "[A-Z]" "[a-z]" | pr -2
) > toprint
|
zloop
|
and feeding the standard output of that
subshell (13.7
)
,
and all of the commands,
to the toprint
file.
You may never do anything that fancy with zloop
.
The script is on the CD-ROM. |