检查文件是否为存档;如果是,提取

Mic*_*hał 5 scripting archive shell-script 7z files

如何检查文件是否为存档,然后使用7z. 我知道我可以通过file命令检查它,但由于它的输出,它在脚本中不起作用。我无法预测它可能是什么类型的存档。我只想做这样的事情:

我可以通过7z提取它吗?
如果是,提取,
如果不是,进一步

通过 bash 脚本。

Hun*_*son 11

filename=/tmp/foo.gz

if 7z t $filename; then
    7z e $filename
else
    echo $filename not an archive.
fi
Run Code Online (Sandbox Code Playgroud)

  • @αғsнιη 退出代码 0 表示 shell 中的“成功”或“真实”(令人困惑,我知道),因此这是答案中的正确方法。 (6认同)

Kus*_*nda 8

7z如果它执行的操作失败,该实用程序将返回一个非零退出代码。您可以使用此事实来尝试提取存档,然后在失败时执行其他操作:

if ! 7z e filename 2>/dev/null; then
    # do something else
fi
Run Code Online (Sandbox Code Playgroud)

或者,取决于你还想做什么,或者不做什么,

if 7z e filename 2>/dev/null; then
    exit
fi

# do something else
Run Code Online (Sandbox Code Playgroud)

可以缩短为

7z e filename 2>/dev/null && exit

# do something else
Run Code Online (Sandbox Code Playgroud)

你显然可以把它包起来

if 7z t filename; then

fi
Run Code Online (Sandbox Code Playgroud)

并捕获提取失败(由于没有足够的磁盘空间或提取期间可能发生的任何其他错误)与确定这确实是7z存档的失败分开。

完整的代码可能看起来像

if 7z t filename 2>/dev/null; then
    if 7z e filename 2>/dev/null; then
        echo 'All is good, archive extracted' >&2
    else
        echo 'Archive failed to extract' >&2
    fi
else
    echo '7z failed to process the file' >&2
fi
Run Code Online (Sandbox Code Playgroud)


小智 6

如果7z t <archive>返回 0,则该文件是有效的存档。