2010-07-27 15 views
12

Başlangıcım olması gereken şey değil.Bir dizi dizini gzipping ve katran sıkıştırılmış dosya oluşturma

Dizinlerin listesini yeni bir zip dosyasına kopyalayacak küçük bir toplu komut dosyası oluşturmak istiyorum.

  1. bir dosyadan okunan (config.txt demek):

    Ben dosyaların listesini kanıtlayan düşünebilirsiniz iki şekilde (en azından) vardır. dosyası (gerçi daha az zarif) İlk seçenek daha basit görünüyor bash komut

doğrudan listeyi sıkıştırmak dizinleri listesini içerir VEYA

  • sert kod olacaktır. Karşılıklı

    iki sorun ben nasıl emin değilim şunlardır:

    • dizin listesine üzerinde kabuk komut dosyasına
    • iterate dizinlerinin listesini sağlamak

    Birisi birkaç satırda önerebilir, bunu nasıl yapabilirim? Bir bash komut bunu yapmak istiyorsa

    tar czvf mytar.tar.gz dir1 dir2 .. dirN 
    

    ve pass: BTW

    , ben aşağıdaki gibi komut satırında gzip'li katran oluşturabilir Ubuntu 10.0.4 üzerinde

  • cevap

    24

    çalıştırıyorum betikleri argüman olarak dizinler, bu argümanlar [email protected] içinde sona erecek. Öyleyse vardır:

    tar czvf mytar.tar.gz "[email protected]" 
    

    bir komut ise, çağırır (myscript.sh diyelim) bu kadar:

    ./myscript.sh dir1 dir2 .. dirN 
    

    bir listeden okumak istiyorsanız (opsiyon 1) yer gerekli tüm dizinleri (bir on - filelist:

    tar czvf mytar.tar.gz $(<config.txt) 
    
    +0

    @peter: Cevabınız için teşekkürler - Ben olmak istediğim yer neredeyse beni alır. Ama ben tembel, ve komut satırında her zaman aynı dosya listesini yazmak istemiyorum (ayrıca bu hataya eğilimli) - bu yüzden, komut dosyasının kendisinde ya da ayrı ayrı dizin listesini 'hard code' yapmak istiyorum. harici bir dosyada tutulur. Bunu yapmak için yukarıdaki komutları nasıl değiştirebileceğimi açıklayabilir misiniz? – morpheous

    +0

    tatlı !. Yapmak istediğim şeye benziyor. Ancak sözdizimi oldukça korkutucu görünüyor. Kendimi bir bash programlama kitabı almalıyım - HIZLI! :) – morpheous

    +0

    @morpheus: Bir kitap satın almanın yanı sıra, 'adam bash' (bu durumda * Komut Değiştirme * bölümü) 'nü okumayı tavsiye ederim. Ayrıca, config.txt ile çözümün adında boşluk bulunan dizinler için çalışmadığını unutmayın. –

    0

    iki dosya oluşturun: Eğer (dizin isimlerinde boşluk varsa bu çalışmıyor) şöyle bunu yapabilir tek satır)

    ve basit bir bash komut dosyası oluşturmak: Sen ".... Dir1 dir2 Dir3" DİZİNLERİNİZİ = gibi bir değişken aktarabilirsiniz Ve komut aşağıdaki gibi değişken kullanmak gerekir

    #!/bin/bash 
    
    
    for DIR in `cat filelist` 
    do 
        if [ -d $DIR ] 
        then 
         echo $DIR 
        fi 
    done 
    
    0

    Dosyaya/dizin adlarını dosyaya yazdığınızda null-byte'ı sınırlayıcı olarak kullanmanız yeterlidir. Bu sayede dosya isimlerindeki boşluklar, yeni satırlar vb. Endişelenmenize gerek yok!

    printf "%s\000" */ > listOfDirs.txt # alternative: find ... -print0 
    
    while IFS="" read -r -d '' dir; do command ls -1abd "$dir"; done < listOfDirs.txt 
    
    tar --null -czvf mytar.tar.gz --files-from listOfDirs.txt 
    
    0

    Bir dizini sıkıştırmak istiyorsanız, aşağıdaki komut yardımcı olabilir.

    pbzip2 compresses directories using parallel implementation

    tar cf <outputfile_name> --use-compress-prog=pbzip2 <directory_name> 
    
    İlgili konular