/ / Script Unix per trovare tutte le cartelle nella directory, quindi tar e spostarle - bash, unix, shell, tar

Script Unix per trovare tutte le cartelle nella directory, quindi tar e spostarle - bash, unix, shell, tar

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:

  1. Trova tutte le cartelle nella directory /fss/fin
  2. Tar le cartelle
  3. Sposta le cartelle in un'altra directory /fs/fi che si trova sul server s11003232sz.net
  4. Su richiesta dell'utente, è necessario decomprimere le cartelle e spostarle nuovamente nella directory originale /fss/fin

risposte:

5 per risposta № 1

ecco 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