2010-10-22 8 views
0

Fondamentalement, j'ai besoin d'exécuter un script Unix pour trouver tous les dossiers dans le répertoire/fss/fin, si elle existe; alors je l'ai taré et je passe à un autre répertoire/fs/fi.Unix script pour trouver tous les dossiers dans le répertoire, puis tar et les déplacer

Ceci est ma commande jusqu'à présent:

find /fss/fin -type d -name "essbase" -print 

Ici je l'ai mentionné directement le nom du dossier essbase. Mais au lieu de cela, je voudrais trouver tous les dossiers dans le /fss/fin et les utiliser tous.

Comment puis-je trouver tous les dossiers du répertoire /fss/fin & pour les déplacer vers /fs/fi?

Précision 1:

Oui Je dois trouver que tous les dossiers dans le répertoire /fss/fin répertoire à l'aide d'un script shell Unix et les goudrons dans un autre répertoire /fs/fi.

Précision 2:

Je veux dire clairement à l'exigence. Le script Shell doit contenir:

  1. Trouver tous les dossiers dans le répertoire /fss/fin
  2. Tar les dossiers
  3. Déplacer les dossiers dans un autre répertoire /fs/fi qui est situé sur le serveur s11003232sz.net
  4. Sur utilisateur demande ce devraient décompresser les dossiers et les retourner dans le répertoire Orignal /fss/fin
+0

avez-vous besoin de tous les fichiers dans les dossiers ou seulement les dossiers eux-mêmes? – seejay

+0

Veuillez modifier la question pour clarifier les exigences. –

+0

Vous avez encore besoin de penser et d'expliquer plus clairement ce que vous recherchez. En particulier, y a-t-il un intervalle de temps arbitraire entre les étapes 1..3 et 4? Un seul script n'est pas un bon moyen de gérer ces intervalles de temps. Où le fichier tar doit-il être placé? Ce que vous voulez dire à l'étape 3 n'est pas clair - que signifie le commentaire «Qui dans le serveur xxxx»? Cherchez-vous à déplacer les données vers une autre machine? Pourquoi est-ce que 4 "ne déplace pas les dossiers vers l'emplacement d'origine"? Pourquoi déplacer les répertoires lorsque vous en avez fait une copie dans le fichier tar? Pourquoi ne pas simplement supprimer les dossiers? Quel est le véritable objectif? Devoirs? –

Répondre

2

Depuis tar répertoires automatiquement, vous n'avez vraiment pas besoin de faire beaucoup. En supposant que GNU tar:

tar -C /fss/fin -cf - essbase | 
tar -C /fs/fi -xf - 

L'option '-C' change répertoire avant d'utiliser. Le premier tar écrit sur la sortie standard (le seul '-') tout ce qui se trouve dans le répertoire essbase. La sortie de ce tar est canalisée au second tar, qui lit son entrée standard (le seul '-'; amusant n'est-ce pas!).


En supposant trouver GNU, vous pouvez également faire:

(cd /fss/fin; tar -cf - $(find . -maxdepth 1 -type d | sed '/^\.$/d')) | 
       tar -xf - -C /fs/fi 

Cela change vers le répertoire source; il exécute 'find' avec une profondeur maximale de 1 pour trouver les répertoires et supprime le répertoire courant de la liste avec 'sed'; le premier 'tar' écrit alors la sortie dans la seconde, qui est la même que précédemment (sauf que j'ai changé l'ordre des arguments pour souligner le parallélisme entre les deux invocations).


Si vos répertoires de niveau supérieur (ceux réellement dans/fss/fin) ont des espaces dans les noms, alors il y a plus de travail à faire à nouveau - Je suppose qu'aucun des répertoires à sauvegarder début avec « »:

(cd /fss/fin; find * -maxdepth 0 -type d -print 0 | xargs -0 tar -cf -) | 
tar -xf - -C /fs/fi 

Cette sarcle les non-répertoires dans la liste générée par « * », et les écrit avec nUL « \ 0 » (zéro octets) marquant la fin de chaque nom (au lieu d'un retour à la ligne). La sortie est écrite dans 'xargs', qui est configuré pour attendre les noms terminés par NUL, et exécute 'tar' avec les noms de répertoires corrects. La sortie de cet ensemble est envoyée au second goudron, comme précédemment.

Si vous avez des noms de répertoires commençant par '.' pour collecter, puis ajouter '.[a-z]*' ou un autre motif approprié après le '*'; Il est crucial que ce que vous utilisez ne liste pas '.' ou '..'. Si vous avez des noms commençant par des tirets dans le répertoire, alors vous devez utiliser './*' et './.[a-z]*'.

Si vous avez des exigences encore plus perverses, énoncez-les clairement dans un amendement à la question.

+0

Un script Unix devrait d'abord trouver tous les dossiers, puis le tarer, alors comment on peut écrire un script shell Unix – Shenna

+0

C'est un script shell (un deux lignes); il n'a pas besoin de trouver les dossiers parce que 'tar' est bon à faire cela pour vous. Si vous voulez plus que le répertoire 'essbase', nous avons encore un peu de travail à faire. –

+0

Comment nous pouvons écrire un script pour que – Shenna

-1

Cela devrait le faire:

#!/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 
+0

A côté -note: ne fonctionnera pas pour les répertoires avec des espaces blancs dans le nom. – kenorb

0
find /fss/fin -d 1 -type d -name "*" -print 

La commande ci-dessus vous donne la liste des sous-répertoires 1er niveau de la/fss/fin. Alors vous pouvez faire n'importe quoi avec ceci. Par exemple. les goudrons dans votre répertoire de sortie comme dans la commande ci-dessous

tar -czf /fss/fi/outfile.tar.gz `find /fss/fin -d 1 -type d -name "*" -print` 

structure de répertoire original sera recréée après décompressez-ing.

5

ici est un exemple, je travaille avec qui peut vous conduire dans la bonne direction

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 
+1

la question et votre replay nous donner une idée pour compresser le dossier quotidien cpanel quand il utilise la méthode incrémentielle jeter un oeil à http://subversion.assembla.com/svn/lhth/trunk/bash/compress_folder_folders.sh alors merci pour votre rejouer et pour votre aide –

0

Voici un exemple bash (changement /fss/fin, /fs/fi avec vos chemins):

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 

qui trouve tous les dossiers, les goudronne séparément et, en cas de succès, les déplace dans un dossier différent.

Questions connexes