Précédent   Forum des professionnels en informatique > Systèmes > Linux > Système
Système Vos questions autour de l'administration système
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 19/12/2011, 12h37   #1
Membre à l'essai
 
Inscription : décembre 2011
Messages : 10
Détails du profil
Informations forums :
Inscription : décembre 2011
Messages : 10
Points : 22
Points : 22
Par défaut [shell] script de sauvegarde

Bonjour,
je rencontre une colle sur un petit script de sauvegarde de fichier :

Code :
1
2
3
4
#!/bin/bash
for f in /zone/*/root/var/yp/src/netgroup;
        do cp $f /zone/*/root/var/yp/src/netgroup.save.$(date +%Y%m%d-%H%M)
        done
le probleme en l'executant :
pour chaque * (correspondant a un dossier) j obtiens

cp: cannot create /zone/*/root/var/yp/src/netgroup.save.20111219-1234: No such file or directory

alors que j'ai faits le script de test suivant qui fonctionne bien :
Code :
1
2
3
4
5
6
7
#!/bin/bash
for f in /zone/*/root/var/yp/src/netgroup;
        do if test -s fichier;
        then echo netgroup "$f" ATTENTION FICHIER VIDE;
        else echo netgroup "$f" FICHIER OK;
        fi;
        done
Quelqu'un pourrait-il m'eclairer la dessus ?
merci
unedone est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 19/12/2011, 12h57   #2
Expert Confirmé Sénior
 
Homme Laurent Willems
Expert Stop/Start
Inscription : septembre 2002
Messages : 2 551
Détails du profil
Informations personnelles :
Nom : Homme Laurent Willems
Âge : 33
Localisation : Belgique

Informations professionnelles :
Activité : Expert Stop/Start

Informations forums :
Inscription : septembre 2002
Messages : 2 551
Points : 4 271
Points : 4 271
Salut,

Je suppose que tu souhaites faire la copie chaque fichier netgroup dans leur repertoire respectif?


Code :
1
2
 
cp "$f" $(dirname "$f")/netgroup.save.$(date +%Y%m%d-%H%M)
__________________
Alea Jacta Test!
Mygale1978 est déconnecté   Envoyer un message privé Réponse avec citation 30
Vieux 19/12/2011, 14h28   #3
Membre à l'essai
 
Inscription : décembre 2011
Messages : 10
Détails du profil
Informations forums :
Inscription : décembre 2011
Messages : 10
Points : 22
Points : 22
Merci beaucoup , cela fonctionne.
Ou avais-je péché ? cela vient du "*" ?
unedone est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 19/12/2011, 14h40   #4
Membre actif
 
Homme
Inscription : avril 2004
Messages : 91
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 32
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : avril 2004
Messages : 91
Points : 154
Points : 154
oui , tu ne peux pas créer un fichier avec comme un * dans le chemin car la wildcard matche avec plusieurs possibilités.
Grosso modo, ton script disait de faire :
Pour chaque zone de 1 à x , copier le netgroup dans une des zones comprises entre 1 et x. Le script ne peut pas déterminer de quelle zone il s'agit(le * du for n'est pas le même que le * du cp, ce n'est pas une variable)

L'algo de Mygale permet de créer la copie dans le même dossier que le fichier source, en récupérant explicitement ce dossier avec la commande dirname.
__________________
First, they ignore you. Then, they laught at you.Then, they fight you. Then, you win.

Mohandas Gandhi
dokho est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 20/12/2011, 10h53   #5
Membre à l'essai
 
Inscription : décembre 2011
Messages : 10
Détails du profil
Informations forums :
Inscription : décembre 2011
Messages : 10
Points : 22
Points : 22
ok, merci a vous 2 pour vos explications, on y voit plus clair en effet.
Dernière question, si jamais je souhaite copier uniquement mon fichier quand il ne fait pas 0 octet, dois je rajouter une condition dans la boucle ?
En gros j aimerais mutualiser les 2 scripts.
unedone est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 20/12/2011, 11h38   #6
Expert Confirmé Sénior
 
Homme Laurent Willems
Expert Stop/Start
Inscription : septembre 2002
Messages : 2 551
Détails du profil
Informations personnelles :
Nom : Homme Laurent Willems
Âge : 33
Localisation : Belgique

Informations professionnelles :
Activité : Expert Stop/Start

Informations forums :
Inscription : septembre 2002
Messages : 2 551
Points : 4 271
Points : 4 271
Salut,

man bash

Tu peux tester la taille d'un fichier via l'option suivante:

Citation:
-s file
True if file exists and has a size greater than zero.
Exemple

Code :
1
2
3
4
5
6
7
 
if [[ -s testFile.txt ]]
the 
 echo "Ce fichier existe et n\'est pas vide!"
else 
 echo "Ce fichier existe mais est vide."
fi
__________________
Alea Jacta Test!
Mygale1978 est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 20/12/2011, 14h07   #7
Expert Confirmé Sénior
 
Avatar de N_BaH
 
Inscription : février 2008
Messages : 2 071
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 2 071
Points : 4 154
Points : 4 154
heu…
Code :
1
2
3
4
5
6
7
8
9
$ echo "foo" > fichier
$ [ -s fichier ] && echo "existe, et n_est pas vide" || echo "n_existe pas, ou est vide"
existe, et n_est pas vide
$ >fichier
$ [ -s fichier ] && echo "existe, et n_est pas vide" || echo "n_existe pas, ou est vide"
n_existe pas, ou est vide
$ rm fichier 
$ [ -s fichier ] && echo "existe, et n_est pas vide" || echo "n_existe pas, ou est vide"
n_existe pas, ou est vide
pour savoir si le fichier existe ou pas, il faut ajouter un test -f
N_BaH est déconnecté   Envoyer un message privé Réponse avec citation 11
Vieux 20/12/2011, 14h59   #8
Membre actif
 
Homme
Inscription : avril 2004
Messages : 91
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 32
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : avril 2004
Messages : 91
Points : 154
Points : 154
Citation:
Envoyé par N_BaH Voir le message
heu...pour savoir si le fichier existe ou pas, il faut ajouter un test -f
En fait unedone ne veut pas savoir si le fichier existe ou pas, mais uniquement s'il faut le sauvegarder (en clair s'il existe ET contient des données)

Donc comme le disait Mygale, le -s suffit.
__________________
First, they ignore you. Then, they laught at you.Then, they fight you. Then, you win.

Mohandas Gandhi
dokho est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 20/12/2011, 15h13   #9
Membre à l'essai
 
Inscription : décembre 2011
Messages : 10
Détails du profil
Informations forums :
Inscription : décembre 2011
Messages : 10
Points : 22
Points : 22
Effectivement, dans mon premier post j ai fait le test -s verifiant que le fichier n'est pas vide, merci mygale mais ce qui me pose probleme c'est le fait de le copier si et seulement si il n'est pas vide.
le code que tu m'a mis (mygale) fait la meme chose que celui que j'ai mis, je voulais juste l'inclure dans le script de copie.
je verifie la presence des mes fichier, tous ceux qui sont different de la taille 0 Octet, je les copie (car inutile de coipier un fichier vide).
unedone est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 20/12/2011, 17h41   #10
Expert Confirmé Sénior
 
Avatar de N_BaH
 
Inscription : février 2008
Messages : 2 071
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 2 071
Points : 4 154
Points : 4 154
J'ai repris Mygale1978, car si test -s échoue, on ne peut pas savoir si le fichier existe.
Donc, dire «Ce fichier existe mais est vide.» pourrait induire en erreur les prochains lecteurs.
N_BaH est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 20/12/2011, 17h58   #11
Membre actif
 
Homme
Inscription : avril 2004
Messages : 91
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 32
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : avril 2004
Messages : 91
Points : 154
Points : 154
OK, j'étais dans le sujet donc je ne voyais pas l'utilité de la clarification.
Merci pour les futurs lecteurs
__________________
First, they ignore you. Then, they laught at you.Then, they fight you. Then, you win.

Mohandas Gandhi
dokho est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/12/2011, 18h16   #12
Expert Confirmé Sénior
 
Homme Laurent Willems
Expert Stop/Start
Inscription : septembre 2002
Messages : 2 551
Détails du profil
Informations personnelles :
Nom : Homme Laurent Willems
Âge : 33
Localisation : Belgique

Informations professionnelles :
Activité : Expert Stop/Start

Informations forums :
Inscription : septembre 2002
Messages : 2 551
Points : 4 271
Points : 4 271
Merci pour la rectification N_BAH.

Citation:
Envoyé par unedone Voir le message
Effectivement, dans mon premier post j ai fait le test -s verifiant que le fichier n'est pas vide, merci mygale mais ce qui me pose probleme c'est le fait de le copier si et seulement si il n'est pas vide.
le code que tu m'a mis (mygale) fait la meme chose que celui que j'ai mis, je voulais juste l'inclure dans le script de copie.
je verifie la presence des mes fichier, tous ceux qui sont different de la taille 0 Octet, je les copie (car inutile de coipier un fichier vide).
Si on reprend ton ancien algorithme, on constate que:

- tu as inversé les deux instructions => "-s" teste si le fichier à une taille > 0 octes et renvoie true si c'est le cas or dans ton cas tu dis que le fichier est vide...

- tu dois tester la variable $f et pas fichier.

- il devrait suffir de remplacer l'echo par le cp que je t'ai fourni précédemment.

Code :
1
2
3
4
5
6
7
 
for f in /zone/*/root/var/yp/src/netgroup;
        do if test -s fichier;
        then echo netgroup "$f" ATTENTION FICHIER VIDE;
        else echo netgroup "$f" FICHIER OK;
        fi;
        done
__________________
Alea Jacta Test!
Mygale1978 est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 21/12/2011, 00h43   #13
Membre à l'essai
 
Inscription : décembre 2011
Messages : 10
Détails du profil
Informations forums :
Inscription : décembre 2011
Messages : 10
Points : 22
Points : 22
Ok, donc cela donnerai:

Code :
1
2
3
4
5
6
7
 
for f in /zone/*/root/var/yp/src/netgroup;
        do if test -s "$f";
        then cp "$f" $(dirname "$f")/netgroup.save.$(date +%Y%m%d-%H%M);
        else echo netgroup "$f" FICHIER VIDE > /etc/var/log/malog;
        fi;
        done
unedone est déconnecté   Envoyer un message privé Réponse avec citation 10
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 20h10.


 
 
 
 
Partenaires

Hébergement Web