Bash脚本用于识别存档格式并从存档中提取文件不起作用

时间:2014-11-18 15:31:12

标签: bash unix

以下Bash脚本应该识别存档并解压缩它们。存档作为脚本的参数给出。但是,脚本始终尝试解压缩我提供的任何文件,而不依赖于存档类型。

脚本如何工作 - (至少在控制台中)它使用file命令检查文件的描述,然后输出通过管道输出到grep,它正在寻找描述中的特定单词(名称)存档类型),然后它计算这个单词的出现次数。只有计数高于零才执行特定的提取命令。我的意思是,它应该像我描述的那样工作,但事实并非如此。

我尝试test -lt,我尝试将括号更改为括号,我尝试添加分号,但无论我做什么,我总是会收到错误消息。我在下面提供的代码没有错误消息,但它不使用适当的tar提取命令,而是继续使用unzip,这显然不适用于需要其他程序的存档。

#!/bin/bash
zero=0
for plik in $@; do
     if ( file $plik | grep 'zip' | wc -l);
          then 
            unzip $plik
          elif ( file $plik | grep 'tar' | wc -l);
          then 
            tar -xvjf $plik
          elif ( file $plik | grep 'bzip2' | wc -l );
          then 
            tar -xvjf $plik
          elif ( file $plik | grep 'gzip' | wc -l );
          then 
             tar -xvzf $plik
          elif ( file $plik | grep '7-zip' | wc -l ); 
          then 
              7z x $plik
          else
            case $plik in
               *.tar.bz2) tar -xvjf $plik ;;
               *.bz2)     tar -xvjf $plik ;;
               *.tar.gz)  tar -xvzf $plik ;;
               *.tgz)     tar -xvzf $plik ;;
               *.gz)      gunzip $plik ;;
               *.zip)     unzip $plik ;;
               *.7z)      7z x $plik ;;
               *)         echo "I cannot unpack it";
            esac;
     fi
do

NE

3 个答案:

答案 0 :(得分:2)

尝试替换

file $plik | grep 'zip' | wc -l

file "$plik" | grep 'zip'

grep的退出代码告诉您是否至少有一个匹配的行。如果将其传递给wc -l,您将始终获得成功结果,因为字符串“0”表示成功。

当然,您必须替换| wc -l的所有出现。

答案 1 :(得分:1)

如果您可以在系统上安装dtrx,则应该使用它。它是针对您的问题构建的,可通过大多数系统上的软件包管理器获得。

否则,这将是我的建议:

#!/bin/bash

extract() {
    for plik in "$@"; do
        tar -xvaf "$plik" 2>/dev/null && 
            return 0
        case $(file "$plik") in
            *bzip2*)    bzip2 -dk "$plik"        ;;
            *gzip*)     gunzip "$plik"           ;;
            *'7-zip'*)  7z x "$plik"             ;;
            *zip*)                               ;&
            *Zip*)      unzip "$plik"            ;;
            *xz*)                                ;&
            *XZ*)       unxz  "$plik"            ;;
            *)          1>&2 echo "Unknown archive '$plik'"; return 1 ;;
        esac
    done
}

extract archive1 archive2 # ...

一些注意事项:

  • 首先尝试tar的自动检测功能

如果失败

  • 使用shell内置函数,每个归档只运行一次file
  • 引用文件名防范可能存在于文件名中的许多奇怪字符(例如空格)。
  • 恕我直言,没有必要通过扩展来检测存档,因为它们可能有一个错误的名称

答案 2 :(得分:0)

实际上这个脚本需要另一个修改(除了删除wc -l部分)。

如果压缩文件是例如gzip格式,那么它将匹配第一个if子句(file $plik | grep 'zip'),并且无法解压缩gzip压缩文件。

我修改了脚本以匹配最后一个elif的简单zip,并且脚本按预期工作。