2009-09-02 15 views
2

besoin d'aide à ce que mes compétences de script shell sont un peu moins l337 :(scripts Bash pour archiver les fichiers, puis copier de nouveaux

Je dois gzip plusieurs fichiers puis copier les nouveaux ceux sur le dessus d'un autre . endroit je dois être en mesure d'appeler ce script de la manière suivante à partir d'autres scripts

exec script.sh $oldfile $newfile 

quelqu'un peut-il me diriger dans la bonne direction

EDIT:.? pour ajouter plus de détails:

Ce script sera utilisé pour les mises à jour mensuelles de certains documents téléchargés dans un dossier, les anciens documents doivent être archivés dans un fichier compressé et les nouveaux documents, qui peuvent avoir des noms différents, copiés par dessus l'ancien. Le script doit être appelé sur un document par document d'un autre script. Le débit de base pour ce script devrait être -

  1. Le fichier script doit créer une nouvelle gzip archive avec un nom spécifié (créé à partir d'une constante préfixe dans le script et le mois en cours et l'année par exemple prefix.september.2009 .tar.gz) seulement s'il n'existe pas , sinon ajouter à l'existant.
  2. Copiez l'ancien fichier dans l'archive.
  3. Remplacez l'ancien fichier par le nouveau.

Merci à l'avance,
Richard

EDIT: Mode Ajouté détails sur le nom du fichier d'archive

+0

Ok, mais puisque vous voulez stocker plus d'un fichier en un seul fichier compressé, vous devez maintenant spécifier le nom du fichier d'archive comme un argument supplémentaire, car il peut ne peut plus être déterminé depuis oldfile (vous pouvez ajouter oldfile à n'importe quelle archive existante, ou vous pouvez en créer un nouveau). Pouvez-vous indiquer comment vous voulez que cela fonctionne dans votre flux de travail? –

+0

Question Mise à jour: Le nom de fichier doit être créé à partir d'une constante de préfixe dans le script et du mois et de l'année en cours, par ex. fileprefix.month.year.tar.gz – Frozenskys

+0

Je sais que je peux formater le nom de fichier en utilisant quelque chose de similaire à PREFIX = "fileprefix"; FILENAME = $ (date + "$ PREFIX.% B.% Y.gz) mais comment faire Je vérifie si elle existe, et comment ajouter plus de fichiers si c'est le cas – Frozenskys

Répondre

2

Voici le script modifié en fonction de vos éclaircissements. J'ai utilisé tar archives, compressé avec gzip, pour stocker les fichiers multiples dans une seule archive (vous ne pouvez pas stocker plusieurs fichiers en utilisant gzip seul). Ce code est seulement testé superficiellement - il a probablement un ou deux bogues, et vous devriez ajouter du code supplémentaire pour vérifier la réussite du commandement, etc. si vous l'utilisez en colère. Mais il devrait vous y parvenir la plupart du temps.

#!/bin/bash 

oldfile=$1 
newfile=$2 

month=`date +%B` 
year=`date +%Y` 

prefix="frozenskys" 

archivefile=$prefix.$month.$year.tar 

# Check for existence of a compressed archive matching the naming convention 
if [ -e $archivefile.gz ] 
then 
    echo "Archive file $archivefile already exists..." 
    echo "Adding file '$oldfile' to existing tar archive..." 

    # Uncompress the archive, because you can't add a file to a 
    # compressed archive 
    gunzip $archivefile.gz 

    # Add the file to the archive 
    tar --append --file=$archivefile $oldfile 

    # Recompress the archive 
    gzip $archivefile 

# No existing archive - create a new one and add the file 
else 
    echo "Creating new archive file '$archivefile'..." 
    tar --create --file=$archivefile $oldfile 
    gzip $archivefile 
fi 

# Update the files outside the archive 
mv $newfile $oldfile 

Enregistrer comme script.sh, puis le rendre exécutable:

chmod +x script.sh 

Lancez ensuite comme ceci:

./script.sh oldfile newfile 

quelque chose comme `` frozenskys.September.2009.tar.gz , will be created, and newfile will replace ancien fichier . You can call this script with exec` d'un autre script si vous le souhaitez. Mettez simplement cette ligne dans votre deuxième script:

exec ./script.sh $1 $2 
+0

C'est presque ça :) - mais je dois être capable de continuer à ajouter plus de fichiers à l'archive. J'ai mis à jour la Question afin qu'elle explique mieux le flux de ce que j'essaie de faire. – Frozenskys

+0

J'ai mis à jour la question pour ajouter encore plus de détails. – Frozenskys

+0

Vous êtes mon héros, c'est parfait! – Frozenskys

2

Un bon refference pour tout script bash est Advanced Bash-Scripting Guide.

Ce guide explique tout ce que les scripts bash.

L'approche de base que je prendrais est:

Move the files you want to zip to a directory your create. 
    (commands mv and mkdir) 

zip the directory. (command gzip, I assume) 

Copy the new files to the desired location (command cp) 

Dans mon expérience script bash est surtout de savoir comment utiliser bien ces commandes et si vous pouvez l'exécuter sur la ligne de commande, vous pouvez l'exécuter dans votre script .

Une autre commande qui pourrait être utile est

pwd - this returns the current directory 
+1

Et ne pas oublier l'erreur cp, mv, gzip, etc peuvent tous échouer.Tout script que vous écrivez doit être aussi robuste que possible (bonne habitude à entrer.) Vérifiez si $ oldfile et $ newfile existent avant d'essayer de fonctionner sur eux. commande que vous écrivez réussit Perl a une bonne façon de faire: "some_command || die "some_command a échoué", mais nous pouvons aussi le faire dans bash. – Tim

+0

Bon point - mais j'ai besoin de comprendre comment faire fonctionner le script avant de pouvoir ajouter dans la gestion des erreurs :) – Frozenskys

0

Pourquoi n'utilisez-vous pas le contrôle de version? C'est beaucoup plus facile. juste vérifier, et compresser.

(Excusez-moi si ce n'est pas une option)

+0

Bonne idée, et c'est ce que j'utilise pour mes mises à jour de code - en utilisant l'excellent service beanstalkapp, mais ce n'est pas une option pour ces documents. – Frozenskys

Questions connexes