2010-11-29 50 views
5

Mes utilisateurs seront zipping des fichiers qui ressemblera à ceci:Décompressez fichier ZIP et extraire le contenu du nom du dossier inconnu

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

Je veux extraire ce fichier zip comme suit:

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

Mon le problème est avec UnknownName - je ne sais pas ce que c'est avant et extraire tout au niveau "base" brise tous les chemins relatifs dans index.html

Comment puis-je extraire de ce fil ZIP e le contenu de UnknownName?

Y at-il quoi que ce soit mieux que:

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

S'il y a plus d'un sous-répertoire au niveau UnknownName, je peux rejeter le fichier zip de cet utilisateur.

Répondre

6

Je pense que votre approche est bonne. L'étape 2 pourrait être améliorée en extrayant dans un répertoire nouvellement créé (plus tard supprimé) afin que la "détection" soit triviale.

# 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

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

0

L'autre option que je peux voir autre que celle que vous avez suggérée est d'utiliser le drapeau unzip -j qui va vider tous les chemins et mettre tous les fichiers dans le répertoire courant. Si vous êtes certain que chacun de vos TEMPLATE1.ZIP fichiers comprend un index.html et *.jpg fichiers, vous pouvez juste faire quelque chose comme:

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

Ce n'est pas exactement la solution la plus propre, mais au moins vous ne devez pas faire une analyse syntaxique comme vous le faites dans votre exemple. Je ne peux pas trouver aucune option similaire à patch -p# qui vous permet de spécifier le niveau de chemin.

0

Chaque zip et unzip diffère de commande, mais il y a généralement un moyen de lister le contenu du fichier. À partir de là, vous pouvez analyser la sortie pour déterminer le nom du répertoire inconnu.

Sur Windows, la version de 1996 Wales/Gaily/van der Linden/Rommel est unzip -l.

Bien sûr, vous pouvez simplement autoriser le dézippage à décompresser les fichiers dans le répertoire de votre choix, puis utiliser mv pour renommer le répertoire comme vous le souhaitez.

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

Il est toujours une bonne idée de créer un répertoire temporaire pour ces types d'opérations au cas où vous finissez l'exécution de deux instances de cette commande.