There I said it !
Yeah, it’s a pain. Leads to bad one liners:
for i in $(ls); do zcat $i || cat $i; doneBtw, don’t parse ls. Use
find |while read -rinstead.find -maxdepth 1 -name "term" -print |while read -r file do zcat "$file" 2>/dev/null || cat "$file" doneWon’t this cause cat to iterate through all files in the cwd once zcat encounters an issue, instead of just the specific file?
Yeah, i was tired and had $file there first, then saw that you wanted to cat all in directory. Still tired, but i think this works now.
You can just do
for f in *(or other shell glob), unless you needfind’s fancy search/filtering features.The shell glob isn’t just simpler, but also more robust, because it works also when the filename contains a newline;
find .. | while read -rwill crap out on that. Also apparently you wantwhile IFS= read -rbecause otherwise read might trim whitespace.If you want to avoid that problem with the newline and still use find, you can use
find -execorfind -print0 .. | xargs -0, orfind -print0 .. | while IFS= read -r -d ''. I think-print0is not standard POSIX though.because it works also when the filename contains a newline
Doesn’t that depend on the shell?
I don’t think so and have never heard that, but I could be wrong.
Thanks !
But still we shouldn’t have to resort to this !
Also, can’t get the output through pipefor i in $(ls); do zcat $i || cat $i; done | grep mysearchtermthis appears to workfind . -type f -print0 | xargs -0 -I{} sh -c 'zcat "{}" 2>/dev/null || cat "{}"' | grep "mysearchterm"Still, that was a speed bump that I guess everyone dealing with mass compressed log files has to figure out on the fly because zcat can’t read uncompressed files ! argg !!!for i in $(ls); do zcat $i 2>/dev/null || cat $i; done | grep mysearchterm
just use
-flol.less $(which zcat)shows us agzipwrapper. So we look throughgzipoptions and see:-f --force
Force compression or decompression. If the input data is not in a format recognized by gzip, and if the option --stdout is also given, copy the input data without change to the standard output: let zcat behave as cat.party music
That works great now I can zcat -f /var/log/apache2/*
Celeste. Are you here? In a future search maybe?
Well, the source code is available. Fix it if you need it that bad.
Man, I have a minor inconvenience.
installs Gentoo
Where is it? I can’t seen to find it https://github.com/zCat?tab=repositories
It’s part of GNU Gzip, and zcat is basically just a shell script that runs
exec gzip -cd "$@"meaning you can actually just docat /usr/bin/zcatto get the source.


