2016-03-22 24 views
1

İçinde projelerle dolu bir dizinim var, diyelim ki /Users/Me/Projects.Birden çok dizinden çoklu tar.gz arşivleri oluşturun

Bu klasörün içinde birden çok alt dizin vardır ve bunlardan bazıları içinde daha fazla alt dizin bulunur.

Her arşivin /Users/Me/Projects içerisindeki bir arşivi olan ve arşivleri dizinin adıyla aynı adı taşıyan bir tar.gz arşivi oluşturmak istiyorum. Örneğin, Projects klasöründe, Project1, Project2 ve Project3. Ben istiyorum ne

, bunun altında alt dizinleri Project1.tar.gz, Project2.tar.gz ve Project3.tar.gz oluşturmak için Projects yılında dizinleri ve henüz sona döngü için bir komut dosyası çalıştırmaktır.

cevap

2

find olmadan:

for dir in */; do tar -czvf "${dir%/}".tar.gz "$dir"; done 
*/ glob sadece dizinleri aynı olduğundan emin olur

ve "${dir%/}" dizin isimlerinden sondaki eğik çizgi kaldırır.

Gizli dizinler varsa, bunlar /*; Bunları da al, shopt -s dotglob kullanabiliriz.

+0

Cevabınız için teşekkürler. Kısa bir sorum vardı, bu senaryoyu yeni oluşturulmuş arşivleri orijinal dizinlerinin olduğu yerde başka bir yere çıkarmak için nasıl değiştirebilirim? Bu arşivleri oluşturduğum genişletilmiş dizinlerin çoğu harici sabit diskimde yer alıyor ve arşivleri dahili sabit diskime yerleştirmek istiyorum. * Için; tar -czvf /Users/Username/Archives/"${dir%/}".tar.gz "$ dir"; örneğin? –

+0

@ jzg.dev Tam olarak! Bir komutun ne yaptığından emin değilseniz, her zaman önüne bir 'echo' ekleyebilir ve gerçekten de onları çalıştırmadan kaldırdığınız komutları görebilirsiniz: * için; echo katran ...' –

+1

Yardımın için teşekkürler! :) –

1

Bazı arama ve biraz deneme/hatadan sonra, yapmaya çalıştığım şeyi programatik olarak gerçekleştirmek için bu komut dosyasını buldum. Söz verdiğim örnekte kapalı tekrar gidiyor

#! /bin/sh 

    for dir in `find . -maxdepth 1 -mindepth 1 -type d | sed 's|./||'` 
    do 
     tar -czvf /Path/To/Place/Created/Archives/$dir.tar.gz /Path/To/Directories/$dir; 
    done 

, script bu benim Documents klasörde arşivleri yaratmak istedik varsayarak gibi görünecektir.

#! /bin/sh 

    for dir in `find . -maxdepth 1 -mindepth 1 -type d | sed 's|./||'` 
    do 
     tar -czvf /Users/Me/Documents/$dir.tar.gz /Users/Me/Projects/$dir; 
    done 

bazı daha fazla araştırma sonrasında DÜZENLEME

, Benjamin W. verdiği cevap bunun için en düz yol gibi görünüyor. Yeni oluşturulmuş arşiv adlarından, diğer dosya sistemlerinde oluşabilecek sorunlardan kaçınmak için bir yol bulmayı ümit ediyordum ve tarif ettiğim yöntem beyaz alanı kapsıyordu, içine girdiğim birkaç tıkanıklık vardı. GNU için

+1

Kendi cevabınızı bulmanız için size yardımcı olun ama [for 'ile satırları okumayın] (http://mywiki.wooledge.org/DontReadLinesWithFor) –

+0

sonunda" sed "kullanmak zorunda değilsiniz . -Orada0 kullanırsanız xargs -0 tar ... 'çok güzel bir cevap olacak – HuStmpHrrr

1

bulmak:

cd /Users/Me/Projects 
find . -maxdepth 1 -mindepth 1 -type d -exec tar -cvzf {}.tgz {} \; 
İlgili konular