2013-04-10 14 views
12

Ho un sacco di directory che devono essere ripristinate, ma devono prima essere impacchettate in un file .tar. C'è uno script che mi permetterebbe di impacchettare tutte le 100+ directory nel proprio tar, così dir diventa dir.tar.per ogni dir crea un file tar

Finora tentativo:

for i in *; do tar czf $i.tar $i; done 
+2

Se c'è un modo di elencarli esplicitamente ... sì. – tink

+0

Sono soli nella loro stessa directory se questo aiuta a renderlo possibile. –

+2

Probabilmente il tink voleva dirti che SO non è un sito "scrivi i miei script per me". Cosa hai provato fino ad ora? –

risposta

31

Lo script che hai scritto non funziona se si dispone di alcuni spazi in un nome di directory, perché il nome sarà diviso, ed inoltre sarà tar file se esistono su questo livello.

È possibile utilizzare questo comando per elencare le directory non ricorsivamente:

find . -type d -maxdepth 1 -mindepth 1 

e questo per eseguire un tar su ciascuno:

find . -type d -maxdepth 1 -mindepth 1 -exec tar cvf {}.tar {} \; 
+3

Aggiungi '' per rimuovere le directory originali una volta archiviate: 'find. -maxdepth 1 -mindepth 1 -type d -exec tar cvf {} .tar {} --remove-files \; ' –

+6

comprime' find. -tipo d -maxdepth 1 -mindepth 1 -exec tar zcvf {} .tar.gz {} \; ' –

5

Avete i nomi delle directory con spazi tra loro a quel livello? Altrimenti, lo script funzionerà perfettamente.

Cosa faccio di solito è scrivere uno script con il comando che desidera eseguire eco fuori:

$ for i in * 
do 
    echo tar czf $i.tar $i 
done 

allora si può guardare l'output e vedere se si tratta di fare quello che vuoi. Dopo aver determinato che il programma funzionerà, modificare la riga di comando e rimuovere il comando echo.

1

se il numero di directory sono molto grandi ed i loro nomi sono troppo lunghi

dopo l'esecuzione del numero di istruzione uno

for i in * 
    do 
    echo tar czf $i.tar $i 
    done 

si otterrà l'errore "stringa troppo lungo"

1

Se ci sono spazi nei nomi delle directory, quindi inserire le variabili tra virgolette doppie:

for i in * 
do 
    tar czf "$i.tar" "$i" 
done 
Problemi correlati