Fondamentalmente ho bisogno di eseguire uno script Unix per trovare tutte le cartelle nella directory / fss / fin, se esiste; quindi ho tar e mi sposto in un'altra directory / fs / fi.
Questo è il mio comando finora:
find /fss/fin -type d -name "essbase" -print
Qui ho citato direttamente il nome della cartella essbase
. Ma invece, vorrei trovare tutte le cartelle in /fss/fin
e usali tutti.
Come posso trovare tutte le cartelle in /fss/fin
directory e tar loro per spostarli in /fs/fi
?
Chiarimento 1:
Sì, devo trovare solo tutte le cartelle nella directory
/fss/fin
usando uno script della shell Unix e tarandoli in un'altra directory/fs/fi
.
Chiarimento 2:
Voglio chiarire il requisito. Lo script della shell dovrebbe contenere:
- Trova tutte le cartelle nella directory
/fss/fin
- Tar le cartelle
- Sposta le cartelle in un'altra directory
/fs/fi
che si trova sul servers11003232sz.net
- Su richiesta dell'utente, è necessario decomprimere le cartelle e spostarle nuovamente nella directory originale
/fss/fin
risposte:
5 per risposta № 1ecco un esempio con cui sto lavorando che può condurti nella direzione corretta
BackUpDIR="/srv/backup/"
SrvDir="/srv/www/"
DateStamp=$(date +"%Y%m%d");
for Dir in $(find $SrvDir* -maxdepth 0 -type d );
do
FolderName=$(basename $Dir);
tar zcf "$BackUpDIR$DateStamp.$FolderName.tar.gz" -P $Dir
done
2 per risposta № 2
Da tar
fa le directory automaticamente, non c'è davvero bisogno di fare molto. Supponendo che GNU tar:
tar -C /fss/fin -cf - essbase |
tar -C /fs/fi -xf -
Il "-C
"L'opzione cambia directory prima di operare. La prima tar
scrive sullo standard output (il solitario "-") tutto ciò che si trova nel file essbase
directory. L'output di quello tar
viene reindirizzato al secondo tar
, che legge il suo input standard (il solitario "-"; il divertimento non lo è!).
Supponendo che GNU trovi, puoi anche fare:
(cd /fss/fin; tar -cf - $(find . -maxdepth 1 -type d | sed "/^.$/d")) |
tar -xf - -C /fs/fi
Questo cambia la directory nella directory di origine;esegue "find" con una profondità massima di 1 per trovare le directory e rimuove la directory corrente dall'elenco con "sed"; il primo "tar" scrive quindi l'output sul secondo, che è lo stesso di prima (tranne che ho cambiato l'ordine degli argomenti per enfatizzare il parallelismo tra le due invocazioni).
Se le tue directory di livello superiore (quelle attualmente in / fss / fin) hanno spazi nei nomi, allora c'è ancora molto lavoro da fare di nuovo - suppongo che nessuna delle directory di cui fare il backup inizi con un ".":
(cd /fss/fin; find * -maxdepth 0 -type d -print 0 | xargs -0 tar -cf -) |
tar -xf - -C /fs/fi
Questo elimina le non directory dall'elencogenerato da "*" e li scrive con NUL "
Se hai nomi di directory che iniziano con un "." per raccogliere, quindi aggiungere ".[a-z]*
"o un altro modello adatto dopo" * "; è fondamentale che ciò che si utilizza non elenchi". "o" .. ". Se nella directory sono presenti nomi che iniziano con trattini, è necessario utilizzare"./*
" e "./.[a-z]*
".
Se hai requisiti ancora più perversi, enunciali chiaramente in un emendamento alla domanda.
0 per risposta № 3
find /fss/fin -d 1 -type d -name "*" -print
Il comando precedente fornisce l'elenco delle sottodirectory di 1 ° livello di / fss / fin. Quindi puoi fare qualsiasi cosa con questo. Per esempio. tar loro nella directory di output come nel comando di seguito
tar -czf /fss/fi/outfile.tar.gz `find /fss/fin -d 1 -type d -name "*" -print`
La struttura della directory originale verrà ricreata dopo l'estrazione.
0 per risposta № 4
Ecco un esempio bash (modifica /fss/fin
, /fs/fi
con i tuoi percorsi):
dirs=($(find /fss/fin -type d))
for dir in "${dirs[@]}"; do
tar zcf "$dir.tgz" "$dir" -P -C /fs/fi && mv -v "$dir" /fs/fi/
done
che trova tutte le cartelle, tararle separatamente e, in caso di successo, spostarle in cartelle diverse.
-1 per risposta № 5
Questo dovrebbe farlo:
#!/bin/sh
list=`find . -type d`
for i in $list
do
if [ ! "$i" == "." ]; then
tar -czf ${i}.tar.gz ${i}
fi
done
mv *.tar.gz ~/tardir