如何在sh中编写自动解压缩文件的代码?

如何在sh中编写自动解压缩文件的代码?

我正在编写一个处理日志文件的 shell 脚本。有时文件可能被压缩——并且文件名中有适当的后缀。

在这种情况下,我想将解压缩添加到文件处理管道中:

case "$file" in:
*.gz)  READER="gzip -cd" ;;
*.bz2) READER="bzip2 -cd" ;;
...
*)     READER="cat" ;;
esac
$READER < $file | processing

这可行,但我不喜欢它,因为当文件解压缩时,cat它会被无用地调用。在这种情况下我想直接打开文件:

< $file processing

我尝试使用eval并制作|的一部分$READER,但这弄乱了加工管道作为 eval 也适用于...

有什么建议么?

答案1

我的建议是,没有任何理由去关心猫的无用使用(“UUOC”)。

在这种情况下,它甚至不是“无用”的用途 -cat作为默认过滤器具有非常有用的目的,这样您就不必编写额外的代码行来处理特殊情况。

不必要的复杂性是比 UUOC 更严重的编程“犯罪”。

顺便说一句,如果这cat真的让你烦恼,你可以使用ucat工具unp集,避免重新发明轮子。 unp似乎没有主页,但至少为 debian 和 ubuntu 打包了(目前由 debian 开发人员 Eduard Block 维护)。

Package: unp
Version: 2.0~pre7+nmu1
Installed-Size: 133
Maintainer: Eduard Bloch <[email protected]>
Architecture: all
Suggests: bzip2, unrar | unrar-free, xdms, p7zip | p7zip-full, unzip, cabextract,
orange
Description-en: unpack (almost) everything with one command
 unp is a small perl script which makes extraction of any archive files
 a bit easier. It support several compressors and archiver programs,
 chooses the right one(s) automatically and extracts one or more files
 in one go.
 .
 You may also want to install some non-free packages like "unace-nonfree",
 "unrar-nonfree" and "lha" to extract archives of these types.

相关内容