问题是我有一些数据库转储,它们要么是压缩的,要么是纯文本的。文件扩展名等没有区别。zcat
在未压缩的文件上使用会产生错误而不是输出。
是否有另一种cat
工具能够足够智能地检测它获得的输入类型?
答案1
只需添加该-f
选项即可。
$ echo foo | tee file | gzip > file.gz
$ zcat file file.gz
gzip: file: not in gzip format
foo
$ zcat -f file file.gz
foo
foo
(如果您不是 GNU(或像现代 BSD 中那样的 GNU 模拟)并且只知道文件,请使用gzip -dcf
代替)。zcat -f
zcat
.Z
答案2
一个可移植的简单建议是使用zgrep
代替zcat
,并且仅使用与每一行匹配的搜索模式。
zgrep $ some-file
与 不同的是zcat
,zgrep
它将愉快地处理未压缩的文件。来自 man zgrep:
zgrep - search possibly compressed files for a regular expression
答案3
有了 GNU,gzip
你就可以做到zcat file 2> /dev/null || cat file
。这不是 POSIX 标准,并且不适用于 BSD gzip
,您确实应该修复您的系统,以便所有gzip
ped 文件都具有.gz
扩展名(当然纯文本文件可能具有任何扩展名,包括.gz
)。
答案4
Bash 中的另一种选择:
for filename in *;do #Replace with your actual loop
case $filename in
*.gz) gunzip <"$filename";;
*) cat "$filename";;
esac
done