1

我现在已经多次遇到这种需求,我很惊讶我很难找到一种“最佳”方法来连接不同压缩类型的文件。

例如,我有一个目录,其中包含文件content1content2.bz2content3.gz. 如果我想对所有文件执行相同的操作,我必须首先检查它们是什么压缩才能正确解压缩,解压缩,然后执行我的操作。

从那以后,我编写了一个脚本来以“智能”方式处理连接。

#! /bin/bash
# Smart Cat
# usage smcat <file|file*>

for file in $@; do
    end=${file##*.}
    if [[ $end == 'bz2' ]] ; then
        bzcat $file
    elif [[ $end == 'gz' ]] ; then
        gzcat $file
    else
        cat $file
    fi
done

似乎很愚蠢,没有内置的方法来处理所有不同的压缩类型。还是在那里,我还没有找到?感谢大家的帮助!

4

2 回答 2

1

可能没有单一的内置方式来处理不同的压缩类型。如果您不想依赖文件扩展名来确定压缩类型,则可以使用file命令,例如

file test.bz2   
test.bz2: bzip2 compressed data, block size = 900k
于 2013-03-08T22:41:43.360 回答
1

使用 GNU Tar 的自动压缩标志

如果您主要处理 tarball,则可以使用 GNU tar 的自动压缩标志解决部分问题,该标志表示:

 -a, --auto-compress
       use archive suffix to determine the compression program

这可以处理 bz2 和 gz 扩展,但可能会让你因为更奇特的事情而失败。例如:

tar xvfz "$filename"

将在somefile.tar.gzsomefile.tar.bz2上以相同的设施工作。

用于/usr/bin/file识别

文件实用程序通常会在 grep 或 glob 模式的帮助下为您提供正确的文件类型。例如:

$ file foo*
foo:     ASCII text
foo.bz2: bzip2 compressed data, block size = 900k
foo.gz:  gzip compressed data, was "bar", from Unix, last modified: Fri Mar  8 17:33:48 2013

您可以使用 case 语句来简化这些文件的工作,或者迭代文件 glob 或使用"$@". 无论哪种方式,这个例子都应该有帮助:

for file in foo*; do
    case `file "$file"` in
        *ASCII*) cat   "$file" ;;
         *gzip*) zcat  "$file" ;;
          *bz2*) bzcat "$file" ;;
    esac
done
于 2013-03-08T22:51:24.767 回答