2010-07-27 8 views
12

Il mio bash fu non è quello che dovrebbe essere.gzipping su una serie di directory e creazione di un file compresso tar

Voglio creare un piccolo script di batch che copierà un elenco di directory in un nuovo file zip.

ci sono (almeno) due modi posso pensare di provare l'elenco dei file:

  1. letti da un file (dire config.txt). Il file contiene la lista di directory per comprimere O

  2. codificare la lista direttamente nello script bash

La prima opzione sembra più semplice (anche se meno elegante).

I due problemi che sto affrontando sono che io non sono sicuro di come effettuare le seguenti operazioni:

  • fornire l'elenco delle directory allo script di shell
  • iterate sopra l'elenco delle directory

Qualcuno potrebbe suggerire in poche righe, come posso farlo?

BTW, io sono in esecuzione su Ubuntu 10.0.4

risposta

24

È possibile creare un tar compresso con gzip sulla riga di comando come segue:

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

Se si voleva fare che in uno script bash e passare il directory come argomenti per lo script, tali argomenti finirebbero in [email protected]. Allora si ha:

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

Se questo è in uno script (diciamo myscript.sh), si sarebbe chiamata che come:

./myscript.sh dir1 dir2 .. dirN 

Se si desidera leggere da una lista (la vostra opzione 1) si potrebbe fare che in questo modo (questo non funziona se c'è spazi nei nomi di directory):

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

@peter: grazie per la risposta - che quasi mi porta dove voglio essere. Ma sono pigro e non voglio digitare lo stesso elenco di file ogni volta sulla riga di comando (anche questo è soggetto ad errori) - ecco perché voglio "hardcoded" l'elenco delle directory - sia nello script stesso, sia separatamente mantenuto in un file esterno. Potresti spiegare come posso modificare i comandi sopra per farlo? – morpheous

+0

dolce !. Sembra quello che voglio fare. Devo dire che la sintassi sembra piuttosto terrificante. Farò meglio a prendermi un libro di programmazione bash - VELOCE! :) – morpheous

+0

@morpheus: oltre all'acquisto di un libro, consiglierei di leggere 'man bash' (in questo caso la sezione sotto * Sostituzione comando *). Si noti inoltre che la soluzione con config.txt non funziona per le directory con spazi bianchi nel nome. –

0

creare due file: filelist - posto tutte le directory necessarie (uno su singola linea)

e creare un semplice script bash:

#!/bin/bash 


for DIR in `cat filelist` 
do 
    if [ -d $DIR ] 
    then 
     echo $DIR 
    fi 
done 
0

È possibile esportare una variabile come DIRECTORIES = "DIR1 DIR2 dir3 ...." E nello script è necessario utilizzare la variabile come tar czvf $ DIRECTORIES

0

Basta usare il byte nullo come delimitatore quando si scrivono nomi di file/directory su file. In questo modo non devi preoccuparti di spazi, newline, ecc. Nei nomi dei file!

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

Nel caso in cui si desideri comprimere una directory, il seguente comando può essere di aiuto.

pbzip2 compresses directories using parallel implementation

tar cf <outputfile_name> --use-compress-prog=pbzip2 <directory_name> 
Problemi correlati