以下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
答案 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
的自动检测功能如果失败
file
答案 2 :(得分:0)
实际上这个脚本需要另一个修改(除了删除wc -l部分)。
如果压缩文件是例如gzip格式,那么它将匹配第一个if子句(file $plik | grep 'zip'
),并且无法解压缩gzip压缩文件。
我修改了脚本以匹配最后一个elif的简单zip,并且脚本按预期工作。