如何在bash中找到归档文件的压缩方法

如何在bash中找到归档文件的压缩方法,bash,shell,Bash,Shell,当调用我的脚本时,我需要在parametrs中找到归档文件的类型(compress方法),并根据compress方法使用tar和正确的选项 我发现file命令返回关于文件的信息,所以我可以从中获得第二列,并使用一些条件检查它是什么(我只需要支持tar-compressed by gzip或bzip2 not compressed and zip,但我不应该通过后缀检查,而是通过内容检查) 所以我想问,是否有更好的方法来获得压缩的归档方法,而不是通过文件和第二列。感谢最近版本的GNU tar自己解

当调用我的脚本时,我需要在parametrs中找到归档文件的类型(compress方法),并根据compress方法使用tar和正确的选项

我发现file命令返回关于文件的信息,所以我可以从中获得第二列,并使用一些条件检查它是什么(我只需要支持tar-compressed by gzip或bzip2 not compressed and zip,但我不应该通过后缀检查,而是通过内容检查)


所以我想问,是否有更好的方法来获得压缩的归档方法,而不是通过文件和第二列。感谢最近版本的GNU tar自己解决了这个问题,所以您不必这么做,例如tar-xvf myarchive.tar.gz就足够了

否则,请使用以下方法,例如:

function extract()
{
     if [ -f $1 ] ; then
         case $1 in
             *.tar.bz2)   tar xvjf $1     ;;
             *.tar.gz)    tar xvzf $1     ;;
             *.bz2)       bunzip2 $1      ;;
             *.rar)       unrar x $1      ;;
             *.gz)        gunzip $1       ;;
             *.tar)       tar xvf $1      ;;
             *.tbz2)      tar xvjf $1     ;;
             *.tgz)       tar xvzf $1     ;;
             *.zip)       unzip $1        ;;
             *.Z)         uncompress $1   ;;
             *.7z)        7z x $1         ;;
             *)           echo "'$1' cannot be extracted via >extract<" ;;
         esac
     else
         echo "'$1' is not a valid file"
     fi
}

GNUtar的最新版本自己就解决了这个问题,所以您不必这样做,例如tar-xvf myarchive.tar.gz就足够了

否则,请使用以下方法,例如:

function extract()
{
     if [ -f $1 ] ; then
         case $1 in
             *.tar.bz2)   tar xvjf $1     ;;
             *.tar.gz)    tar xvzf $1     ;;
             *.bz2)       bunzip2 $1      ;;
             *.rar)       unrar x $1      ;;
             *.gz)        gunzip $1       ;;
             *.tar)       tar xvf $1      ;;
             *.tbz2)      tar xvjf $1     ;;
             *.tgz)       tar xvzf $1     ;;
             *.zip)       unzip $1        ;;
             *.Z)         uncompress $1   ;;
             *.7z)        7z x $1         ;;
             *)           echo "'$1' cannot be extracted via >extract<" ;;
         esac
     else
         echo "'$1' is not a valid file"
     fi
}

您的最佳选择是要么像现在这样依赖
文件
,要么查找可能的幻数(文件类型标识符通常放在文件的开头)并自己计算出来


例如,ZIP文件以“PK”开头,BZip2文件以“BZ”开头。这些神奇的数字可能更长,但这正是我刚才看到的。

你的最佳选择是要么像现在这样依赖于
文件,要么查找可能的神奇数字(文件类型标识符通常放在文件的开头)并自己计算出来


例如,ZIP文件以“PK”开头,BZip2文件以“BZ”开头。这些神奇的数字可能更长,但这正是我刚才看到的。

我需要通过代码而不是tar来计算,所以我需要找到它。在您的示例中,您使用后缀,对吗?我不应该使用它,我必须使用那个档案中的内容。我需要通过代码而不是tar来计算,所以我需要找到它。在您的示例中,您使用后缀,对吗?我不应该使用它,我必须使用该存档中的内容。我不清楚你不喜欢
文件
程序的输出是什么(也不清楚你在说什么…你应该使用标记作为关键字、命令名等)。我不清楚你不喜欢
文件
程序的输出是什么(而且确实不清楚您在说什么……您应该使用标记来表示关键字、命令名等。)