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. |
|---|