我的用户将会压缩文件,如下所示:
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文件。
答案 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)
每个zip
和unzip
命令都有所不同,但通常有一种列出文件内容的方法。从那里,您可以解析输出以确定未知的目录名称。
在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
为最终运行此命令的两个实例时,为这些类型的操作创建临时目录始终是个好主意。