2010-09-20 10 views
0

Je veux déplacer les fichiers journaux d'un chemin (chemin source) vers un autre chemin (chemin de destination). Ce chemin d'accès source et ce chemin de destination sont présents dans un fichier texte. comme ::comment déplacer des fichiers d'un chemin vers un autre chemin dans unix en utilisant shell-script

source_path=abc/xyz 
    source_path=pqr/abc 
    desination_path=abcd/mlk 

donc je lire ce fichier et les chemins stockés dans différents variables.i ont chemin source multiple donc j'emmagasinés dans un varible qui agit comme tableau. comme ci-dessous ::

sourcePaths=`grep source_path myfile |cut -d= -f2` 
destPath=`grep destination_path myfile |cut -d= -f2` 

et j'ai un seul chemin de destination où je veux déplacer tous ces fichiers. Maintenant, je veux voyager à travers tous ces chemin source, trouver le fichier de logs avec une extension spécifique, zip tous ces fichiers et se déplacer vers le chemin de destination. J'utilise loop pour récupérer les données de la variable sourcePaths (ceci est juste un essai). comme:;

for i in $sourcePaths 
do 
    echo $i 
done 

Quelqu'un peut-il m'aider dans ce domaine?

Merci beaucoup pour votre réponse Guys.Now je veux ajouter un filtre dans ce. Je veux déplacer les fichiers du chemin d'accès source qui ont 10 jours, et je veux supprimer ces fichiers du chemin source après le déplacement. S'il vous plaît aider

Juste une autre question !! Que faire si je veux stocker ce fichier zip avec le nom qui contient l'horodatage, de sorte qu'il n'y aura pas de duplication du nom de fichier au chemin de destination.

Salut Tous, une question de plus.Quand je zipper le fichier avec l'option ci-dessus, il est en train de créer sous-dossier dans le fichier zip en fonction de son path.ie. Si je zippe les fichiers logs de src/int/xlog/abc, et quand je décompresse ce fichier zip, le contenu de ce fichier zip nouvellement mis en cache enregistre les fichiers dans src/int/xlog/abc/abc.zip. Je ne veux pas this.what je veux, c'est que ce fichier zip directement contenu abc.zip. Pas dans le sous-dossier.

Salut les gars, je suis de retour avec une autre question.Voici en utilisant le script ci-dessous je suis capable de créer le nom de fichier zip comme base pathname.egxyz.zip et abc.zip selon mon chemin ci-dessus en utilisant le code ci-dessous: :

timestamp=`date +%Y%m%d_%H%M%S` 
zipFile=$destPath/$(basename $sourcePath).$timestamp.zip 

Mais maintenant, je veux créer ce nom de fichier (nom de fichier ieZip) plus spécifique dépend de sa path.Like source si le contenu de mon fichier texte

source_path=obj/imp/backup/logs/db1 
source_path=obj/res/input/int/db2 
desination_path=abcd/mlk 

Maintenant, je veux créer un nom de fichier zip quelque chose comme ça.

backup_logs_db1.zip 
input_int_db2.zip 

signifie que je veux utiliser le nom de trois répertoire pour créer un nouveau nom de fichier zip. Il est fourni que le chemin source dans le contenu du fichier texte plus de trois nom de répertoire.

Donc, quelqu'un peut-il m'aider dans ce domaine. Thnaks à l'avance !!!

Répondre

2

Pour créer des archives ZIP, vous pouvez le faire:

for sourcePath in $sourcePaths 
do 
    zipFile=$destPath/$(basename $sourcePath).zip 
    find $sourcePath -type f -name "*.log" | xargs zip $zipFile [email protected] 
done 

qui va créer

abcd/mlk/xyz.zip (contenant tous les fichiers * .log sous abc/xyz) et
abcd/mlk/abc.zip (contenant tous * .log fichiers sous pqr/abc)

Pour créer des archives au format gzip, vous pouvez:

for sourcePath in $sourcePaths 
do 
    tarFile=$destPath/$(basename $sourcePath).tar 
    find $sourcePath -type f -name "*.log" -exec tar -uvf $tarFile {} \; 
    gzip $tarFile 
done 

qui va créer:

abcd/mlk/xyz.tar.gz (contenant tous les fichiers * .log sous abc/xyz)
abcd/mlk/abc.tar.gz (contenant tous les fichiers * .log sous pqr/abc)


Pour déplacer des fichiers de la source à dest, qui n'a pas été modifié au cours des 10 derniers jours, vous pouvez utiliser ceci:

for sourcePath in $sourcePaths 
do 
    find $sourcePath -type f -mtime +10 -name "*.log" -exec mv {} $destPath \; 
done 

Si vous voulez supprimer les fichiers d'entrée après zipper utilisez les touches suivantes:

for sourcePath in $sourcePaths 
do 
    zipFile=$destPath/$(basename $sourcePath).zip 
    find $sourcePath -type f -mtime +10 -name "*.log" | xargs zip -mT $zipFile [email protected] 
done 

Utilisez la commande date pour générer un horodatage. Les drapeaux sont:

%Y is the year 
%m is the month 
%d is the day 
%H is the hour 
%M are the minutes 
%S are the seconds 

Ajouter l'horodatage au nom du ZipFile, il devient:

for sourcePath in $sourcePaths 
do 
    timestamp=`date +%Y%m%d_%H%M%S` 
    zipFile=$destPath/$(basename $sourcePath).$timestamp.zip 
    find $sourcePath -type f -mtime +10 -name "*.log" | xargs zip -mT $zipFile [email protected] 
done 

Utilisez le drapeau -j zip pour stocker tout le nom du fichier sans le nom du répertoire. La nouvelle commande sera:

for sourcePath in $sourcePaths 
do 
    timestamp=`date +%Y%m%d_%H%M%S` 
    zipFile=$destPath/$(basename $sourcePath).$timestamp.zip 
    find $sourcePath -type f -mtime +10 -name "*.log" | xargs zip -jmT $zipFile [email protected] 
done 
+0

@fahd :: Merci beaucoup pour votre réponse. Maintenant, je veux ajouter un filtre dans ce. Je veux déplacer les fichiers du chemin d'accès source qui ont 10 jours, et je veux supprimer ces fichiers du chemin source après le déplacement. S'il vous plaît aider – MAS1

+0

@ Fahd :: Merci pour la réponse instantanée.Juste une question, est-ce que mes conditions précédentes sont également travailler avec cela. Je veux dire zipper le fichier. Je veux ajouter ces deux filtres seulement, en gardant ma condition précédente telle qu'elle est.Votre précédente réponse satiesfies ma toute condition précédente, Voulez savoir sur ce nouveau message. Et je veux supprimer les fichiers déplacés après le déplacement du chemin source. – MAS1

+0

oui, les conditions précédentes continueront à travailler. La commande 'mv' déplace les fichiers, donc oui, ils ne seront plus dans le chemin source. – dogbane

1

La commande suivante parcourra tous les chemins source, créez un fichier tar.gz dans $ destPath. Ce fichier .tar.gz contient un dossier nommé $sourcePath contenant des fichiers journaux (fichiers avec l'extension .log).
Le nom du fichier .tar.gz sera basé sur le nom de base de $ sourcePath, abc/xyz dans un fichier xyz.tar.gz à créer.

for sourcePath in $sourcePaths;do 
    name=`basename $sourcePath` 
    tar czf "$destPath/$name.tar.gz" $sourcePath/*.log 
done 

Note: vos source_path s ne peuvent pas contenir des espaces ou des tabulations, les fichiers journaux ne sont pas récursive recherché.

Questions connexes