2010-11-29 19 views
5

Mis usuarios estarán cerrando la cremallera de los archivos que se vería así:archivo Descomprimir ZIP y extraer el contenido del nombre de la carpeta desconocida

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

Quiero extraer este archivo zip de la siguiente manera:

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

Mi el problema es con UnknownName - No sé lo que es de antemano y extraer todo al nivel "base" rompe todas las rutas relativas en index.html

¿Cómo puedo extraer de este archivo ZIP e el contenido de UnknownName?

¿Hay nada mejor que:

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

Si hay más de un subdirectorio a nivel UnknownName, que puede rechazar archivo zip de ese usuario.

Respuesta

6

Creo que su enfoque es bueno. El paso 2 podría mejorarse extrayendo a un directorio recién creado (más tarde eliminado) para que la "detección" sea trivial.

# 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" 
+0

buscando 'dir = (" $ tempdest "/ *)' – Sisyphus

0

La otra opción que puedo ver que no sea la que sugirió es usar el indicador unzip -j que vaciará todas las rutas y colocará todos los archivos en el directorio actual. Si usted sabe con certeza que cada uno de sus TEMPLATE1.ZIP archivos incluye un index.html y *.jpg archivos a continuación, sólo se puede hacer algo como:

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

No es exactamente la solución más limpia, pero al menos usted no tiene que hacer ningún análisis como lo haces en tu ejemplo. Parece que no puedo encontrar ninguna opción similar a patch -p# que le permita especificar el nivel de la ruta.

0

Cada zip y unzip difiere de comandos, pero por lo general hay una manera de listar el contenido del archivo. Desde allí, puede analizar el resultado para determinar el nombre desconocido del directorio.

En Windows, la versión 1996 Wales/Gaily/van der Linden/Rommel es unzip -l.

Por supuesto, puede simplemente permitir la descomprimir para descomprimir los archivos en el directorio que desee, luego use mv para cambiar el nombre del directorio a lo que desee.

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

Siempre es una buena idea crear un directorio temporal para este tipo de operaciones en caso de que terminan corriendo dos instancias de este comando.

Cuestiones relacionadas