2010-11-29 18 views
5

Benim kullanıcıların dosyalarını kadar sıkıştırma olacak bilinmeyen klasör adın içeriği:Sıkıştırılmış ZIP ​​dosyası ve ayıklamak

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

ben şöyle bu zip dosyasını ayıklamak istiyorum:

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

Benim sorun UnknownName ile - ne olduğunu bilmiyorum ve "base" düzeyine her şeyi ayıklamak index.html

tüm göreli yolları keser Bu ZIP filinden nasıl ayıklanır içeriği UnknownName? UnknownName düzeyinde birden fazla alt dizin varsa

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

, o kullanıcının zip dosyasını reddedebilirsiniz:

daha iyi orada şey mi.

cevap

6

Bence yaklaşımınız iyi bir şey. Adım 2, yeni oluşturulmuş bir dizine (daha sonra silinmiş) ayıklanmamı geliştirebilir, böylece "algılama" önemsiz olur.

# 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

'dir = (" $ tempdest "/ *)' ifadesini arıyor – Sisyphus

0

Önerdiğim diğer bir seçenek, tüm yolları boşaltıp tüm dosyaları geçerli dizine koyan unzip -j bayrağını kullanmaktır. Tam olarak en temiz çözüm değil

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

ama en azından herhangi ayrıştırma yapmak gerekmez: Eğer kesin olarak bilmek Eğer TEMPLATE1.ZIP dosyaların her biri bir index.html ve *.jpg dosyaları sonra sadece böyle bir şey yapabileceği içerdiğini senin örneğinde olduğu gibi. Yol düzeyini belirtmenize olanak tanıyan patch -p# benzeri herhangi bir seçenek bulamıyorum.

0

Her zip ve unzip komut farklılık, ancak dosya içeriğini listelemek için bir yol genellikle var. Oradan bilinmeyen dizin adını belirlemek için çıktıyı ayrıştırabilirsiniz.

Windows'ta, 1996 Galler/Gaily/van der Linden/Rommel sürümü unzip -l'dir.

Elbette, sadece unzip'in dosyaları istediğiniz dizine kopyalamasını sağlayın, ardından dizinin istediğiniz gibi yeniden adlandırılması için mv kullanın.

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

araçlarının bu komutun iki örneğini çalıştıran sona durumunda, bu tip operasyonlarda için geçici bir dizin oluşturmak için her zaman iyi bir fikirdir.

İlgili konular