解压缩ZIP文件并提取未知文件夹名称的内容

时间:2010-11-29 07:51:16

标签: bash zip unzip

我的用户将会压缩文件,如下所示:

TEMPLATE1.ZIP
   |--------- UnknownName
                   |------- index.html
                   |------- images
                               |------- image1.jpg

我想解压缩这个zip文件如下:

/mysite/user_uploaded_templates/myrandomname/index.html
/mysite/user_uploaded_templates/myrandomname/images/image1.jpg

我的麻烦是UnknownName - 我不知道它是什么事先将所有内容提取到“base”级别会破坏index.html中的所有相对路径

如何从此ZIP文件中提取UnknownName的内容

1. Extract everything
2. Detect which "new subdidrectory" got created
3. mv newsubdir/* .
4. rmdir newsubdir/

如果UnknownName级别有多个子目录,我可以拒绝该用户的zip文件。

3 个答案:

答案 0 :(得分:7)

我认为你的方法很好。第2步可以改进我提取到新创建的目录(后来删除),以便“检测”是微不足道的。

# Bash (minimally tested)
tempdest=$(mktemp -d)
unzip -d "$tempdest" TEMPLATE1.ZIP
dir=("$tempdest"/*)
if (( ${#dir[@]} == 1 )) && [[ -d $dir ]]
    # in Bash, etc., scalar $var is the same as ${var[0]}
    mv "$dir"/* /mysite/user_uploaded_templates/myrandomname
else
    echo "rejected"
fi
rm -rf "$tempdest"

答案 1 :(得分:0)

除了你建议的那个之外,我能看到的另一个选项是使用unzip -j标志,该标志将转储所有路径并将所有文件放入当前目录。如果您确定每个TEMPLATE1.ZIP文件都包含index.html*.jpg个文件,那么您可以执行以下操作:

destdir=/mysite/user_uploaded_templates/myrandomname
unzip -j -d "$destdir"
mkdir "${destdir}/images"
mv "${destdir}/*.jpg" "${destdir}/images"

这不是最干净的解决方案,但至少你不需要像在你的例子中那样进行任何解析。我似乎找不到任何类似于patch -p#的选项,允许您指定路径级别。

答案 2 :(得分:0)

每个zipunzip命令都有所不同,但通常有一种列出文件内容的方法。从那里,您可以解析输出以确定未知的目录名称。

在Windows上,1996年的Wales / Gaily / van der Linden / Rommel版本为unzip -l

当然,你可以简单地让unzip将文件解压缩到它想要的任何目录,然后使用mv将目录重命名为你想要的目录。

$tempDir = temp.$$
mv $zipFile temp.$$
cd $tempDir
unzip $zipFile
$unknownDir = *   #Should be the only directory here
mv $unknownDir $whereItShouldBe
cd ..
rm -rf $tempDir

为最终运行此命令的两个实例时,为这些类型的操作创建临时目录始终是个好主意。