Pages : 1
#1 Le 13/12/2007, à 19:05
- synthia36
script shell sous linux
bonjour a tous; j'ai besoin un peu d'aide sur les script shell sous linux car je suis debutante en linux voilà l'enonce du script:
on nous demande d'ecrire un script qui copie tous les fichiers d'un répertoire nommé par exemple dossier1 dans un 2éme répertoire nommé par exemple dossier2 en renommant tous les fichiers avec l'extension suivante: .old
merci de me répondre.
#2 Le 13/12/2007, à 19:19
- coca25
Re : script shell sous linux
bonjour, tu peux t'aider de cette initiation à bash:
http://www.trustonme.net/didactels/148.html
pour faire ce qui est demandé, tu peux utiliser "for" + "cp"
Hors ligne
#3 Le 13/12/2007, à 19:30
- synthia36
Re : script shell sous linux
voilà ce que j'ai fait mais je ca ne veux pas s'executer :
for i in ./* ; do
cp "$i" "i.old"
done
mais je dois initialiser le iet je ne sais pas comment faire?
#4 Le 13/12/2007, à 19:48
- Yannick_LM
Re : script shell sous linux
Tu n'as pas besion d'initialiser i justement.
Chez moi le script fonctionne, mais tu ne te retrouves qu'avec un seul fichier qui s'appelle i.old...
cp "$i" "$i.old" me paraà®t préférable ...
Trucs et astuces pour Vim
Ma web page avec des trucs dessus ...
Hors ligne
#5 Le 13/12/2007, à 19:55
- synthia36
Re : script shell sous linux
mais comment ça je me trouve avec un seul fichier mais j'ai fait une boucle for donc je devrais avoir tous les fichiers avec l'extension .old non? .
si c'est faux donner svp le bon script car je commence a m'y perdre .
merci
#6 Le 13/12/2007, à 20:11
- coca25
Re : script shell sous linux
le $i est remplacé par le nom du fichier.
or tu fais:
cp "$i" "i.old"
le 2eme i n'est pas une variable, à chaque itération il copie sur i.old, donc tu n'as qu'un fichier à la fin.
remplace "i.old" par "$i.old"
Hors ligne
#7 Le 14/12/2007, à 10:12
- synthia36
Re : script shell sous linux
bonjour ,merci de m'avoir répondu ;donc d'aprés ce que j'ai compris mon script sera comme suit:
cp -r repertoire1 repertoire2 (cette ligne copie tous les fichiers du repertoire1 vers le repertoire 2)
for i in ./* ; do
cp "$i" "$i.old" (cette ligne renomme tous les fichiers en .old)
done
est ce que que c'est le bon script ?
merci
#8 Le 14/12/2007, à 10:47
- best_friend_fr
Re : script shell sous linux
Salut,
La base est bonne, mais:
cp -r repertoire1 repertoire2
Que sont repertoire1 et repertoire2 ? Si ce sont les arguments passes au scripts, ce sont $1 et $2
for i in ./* ; do
cp "$i" "$i.old" (cette ligne renomme tous les fichiers en .old)
done
erreur d'analyse. Tu liste les fichiers du repertoire courrant et non du repertoire1. De plus tu refais une copie. Si tu veux renommer, c'est mv qu'il faut mettre et non cp. Cependant, je te conseillerait plutot de garder le cp et de supprimer la premiere copie.
Pour te faire mieux comprendre, on va executer ton script.
Imagine que tu te trouves dans le repertoire r0, que tu veux copier le repertoire r1 dans r2.
r0 contient: a b c
r1 contient: d e f
r2 n'existe pas.
Tu veux creer r2 avec d.old e.old f.old
Ta premiere copie cree r2 avec d e f
Ensuite, ta boucle copie a l'interieur de r0, a en a.old...
au final tu as
r0:a a.old b b.old c c.old
r1:d e f
r2:d e f
sudo apt-get replace langage_sms by grammaire orthographe ponctuation
La documentation est avant tout faite pour ceux qui posent les questions, et non ceux qui y répondent
Best_friend_fr
Hors ligne
#9 Le 14/12/2007, à 11:05
- johnlege
Re : script shell sous linux
Bonjour,
voici un script simple qui répondra à tes besoins
cd repertoire_a_copie # deplace dans le repertoire a copier
for i in * # liste les elements du repertoire
do
if [ -f "$i" ] # si l'element est un fichier
then
cp ${i} /repertoire_destination/${i}.old # copie le fichier dans le repertoire destination en rajoutant l'extension .old
fi
done
Si tu n'est pas sur de la realisation de ton script, remplace cp par echo, lance ton script en faisant sh -x nom_du_script a lancer
et tu verras l'execution de ton script sans faire de copie
Merci d'indiquer résolu dans le titre quand c'est résolu
Hors ligne
#10 Le 14/12/2007, à 11:14
- synthia36
Re : script shell sous linux
merci a tous de m'avoir répondu .
pour le répertoire1: c'est le répertoire qui contient tous les fichiers f1,f2,f3,..
répertoire2: c'est le répertoire qui va contenir les fichiers avec l'extension suivante: f1.old, f2.old, f3.old,...
je vais essayer ton script johnlege et te donné une réponse si ca marche.
merci
#11 Le 14/12/2007, à 11:17
- best_friend_fr
Re : script shell sous linux
Attention le script en question peut t'induire en erreur... pour bien voir ce qui se passe, demande toi toujours ou tu te trouves (dans quel repertoire). Tu peux le voir avec la commande pwd (a inserer dans le script pour debugger)
sudo apt-get replace langage_sms by grammaire orthographe ponctuation
La documentation est avant tout faite pour ceux qui posent les questions, et non ceux qui y répondent
Best_friend_fr
Hors ligne
#12 Le 14/12/2007, à 11:37
- johnlege
Re : script shell sous linux
Bonjour best_friend_fr,
je ne comprends pas, pourquoi pwd, puisque le script commence par cd repertoire_a_copie et que le nom du répertoire de destination est fixé en absolu /repertoire_destination/
Par contre c'est vrai que nous aurions pu rajouter avant le cd
if [ ! -d repertoire_a_copier ]
then
echo "repertoire a copier inexistant"
exit 1
fi
if [ ! -d /repertoire_destination ]
then
echo "repertoire destination inexistant"
exit 1
fi
cela aurait été mieux
Merci d'indiquer résolu dans le titre quand c'est résolu
Hors ligne
#13 Le 14/12/2007, à 11:40
- synthia36
Re : script shell sous linux
mais comment je fais pour ecrire la commande pwd dans un script?
johnlege j'ai essayer ton script mais il m'ecrit les erreurs suivantes :
essqi.sh:line4:syntax error near unexpected token 'if'
essqi.sh:line4:'if [-f "$i"] then'
mais je ne comprend pas ce que sa veut dire?
voilà ce que j'ai fait dans le script:
j'ai remplacé le repertoire_a_copie par dossier1
et repertoire_destination par dossier2 ,
et cp par echo pour voir l'execution.
puis j'ai enregistrer sous le nom : essqi.sh
puis je suis aller dans la console et j'ai écrit se que vous m'avez dit :sh -x essqi.sh
et ca me donne : +cd dossier1 biensur au debut j'ai creé le repertoire dossier1 puis les fichiers f1,f2,f3 puis le répertoire dossier2 puis j'ai entré :sh -x essqi.sh .
#14 Le 14/12/2007, à 11:50
- coca25
Re : script shell sous linux
les [ ] sont en fait une commande et un argument, il faut mettre des espaces.
le then est à séparer du if (avec un ; ou un retour à la ligne):
if [ -f "$i" ]; then
Hors ligne
#15 Le 14/12/2007, à 11:51
- johnlege
Re : script shell sous linux
n'écris pas if sur la même ligne que then
la syntaxe des shells scripts est sensible
mais quel est ton but ? Ecrire un shell, ou exécuter les commandes qui te permettront de ?
Je ne sais pas à quoi peut servir la commande pwd dans ton cas.
Voilà le script tel que je l'aurai écrit
#!/bin/bash
# test de l'existence du repertoire a copier
f [ ! -d repertoire_a_copier ]
then
echo "repertoire a copier inexistant"
exit 1 # sortie si erreur
fi
# test de l'existence du repertoire destination
if [ ! -d /repertoire_destination ]
then
echo "repertoire destination inexistant"
exit 1 # sortie si erreur
fi
cd repertoire_a_copie # deplace dans le repertoire a copier
for i in * # liste les elements du repertoire
do
if [ -f "$i" ] # si l'element est un fichier
then
cp ${i} /repertoire_destination/${i}.old # copie le fichier dans le repertoire destination en rajoutant l'extension .old
fi
done
pour le tester remplace
cp par echo ${i} /repertoire_destination/${i}.old
enregistre ton script
lance en script
sh -x nom_du_script
Merci d'indiquer résolu dans le titre quand c'est résolu
Hors ligne
#16 Le 14/12/2007, à 11:52
- johnlege
Re : script shell sous linux
manque un i sur f [ ! -d repertoire_a_copier ]
Merci d'indiquer résolu dans le titre quand c'est résolu
Hors ligne
#17 Le 14/12/2007, à 12:41
- synthia36
Re : script shell sous linux
voilà ce que j'ai ecrit:
cd dossier1 # deplace dans le repertoire a copier
for i in * # liste les elements du repertoire
do
if [ -f "$i" ] # si l'element est un fichier
then
echo ${i} /repertoire_destination/${i}.old # copie le fichier dans le repertoire destination en rajoutant l'extension .old
fi
done
et voilà ce j'ai eu lors de l'execution:
+ cd dossier1
+ '[' -f '*' ']'
je ne comprend ce sa veut dire? et je ne trouve pas les fichiers avec l'extension .old dans le répertoire dossier2 pourquoi?
#18 Le 14/12/2007, à 12:48
- coca25
Re : script shell sous linux
t'as du faire une erreur quelque part, parce que ce le code que tu as posté ne correpond pas à la sortie que tu as également postée!
tu as mis des ' ou " autour de *?
Dernière modification par coca25 (Le 14/12/2007, à 12:49)
Hors ligne
#19 Le 14/12/2007, à 13:43
- synthia36
Re : script shell sous linux
j'ai mis des ' autour de * c'est ce que l'execution m'a donné
#20 Le 14/12/2007, à 13:50
- synthia36
Re : script shell sous linux
qu'est ce que sa veut dire if [ ! -d repertoire_a_copier ] le ! -d
et if [ -f "$i" ] le -f ?
merci
#21 Le 14/12/2007, à 13:50
- coca25
Re : script shell sous linux
il faut pas mettre de ' autour de *
j'ai mis des ' autour de * c'est ce que l'execution m'a donné
mais ce n'est pas ce que donne l'execution, t'as réecrit à la main...
ce qui serait mieux quand tu postes une sortie (ou meme le code vu que dans ce que tu as posté, il n'y a pas de '*'), c'est de faire un copie/coller, au moins, on se trompe pas
Hors ligne
#22 Le 14/12/2007, à 13:52
- coca25
Re : script shell sous linux
qu'est ce que sa veut dire if [ ! -d repertoire_a_copier ] le ! -d
et if [ -f "$i" ] le -f ?merci
dans le premier lien que je t'ai passé, tu as l'explication, sinon, un
man test
te sort l'aide complète
Hors ligne
#23 Le 14/12/2007, à 15:06
- johnlege
Re : script shell sous linux
Rebonjour synthia36
il faut que tu respectes la syntaxe mais aussi que tu comprennes chaque commande. L'utilisation du signe # t'indique des commentaires non traités par le shell
Si je reprends ton shell il te manque le fait de copier dans le bon répertoire
je t'ai indiqué /repertoire_destination pour que tu mettes le répertoire o๠copier tes fichiers.
cd dossier1 # deplace dans le repertoire a copier
for i in * # liste les elements du repertoire
do
if [ -f "$i" ] # si l'element est un fichier
then
echo ${i} /repertoire_destination/${i}.old # copie le fichier dans le repertoire destination en rajoutant l'extension .old
fi
done
et voilà ce j'ai eu lors de l'execution:
+ cd dossier1
+ '[' -f '*' ']'
si ton shell s'arrête là c'est parce que tu n'as aucun fichier dans dossier1
if [ -f "$i" ] --> est l'équivalent de si "$i" est un fichier
then ---> alors
fi --> fin si
if [ ! -d repertoire_a_copier ] --> est l'équivalent de si repertoire_a_copier n'est pas un repertoire. le ! est la négation
-f pour fichier
-d pour répertoire
for i in * --> i est le nom de chaque élément trouvé dans le répertoire
$i --> est le nom de la variable que tu peux utiliser dans le shell
l'exécution avec sh -x, peut rajouter des simples cotes, ne t'inquiéte pas
PS: n'oublie quand ton shell est ok, de changer echo qui ne fait qu'afficher par
cp qui copiera tes fichiers
Merci d'indiquer résolu dans le titre quand c'est résolu
Hors ligne
#24 Le 14/12/2007, à 20:45
- best_friend_fr
Re : script shell sous linux
Je continue a croire que les liens qbsolus sont inutiles, et que ca embrouille synthia.
Pour moi, elle est en train de mettre son lien relatif au lieu de l'absolu.
Donc un script plus simple serait:
#!/bin/bash
for i in `ls $1`
do
if [ -f "$1/$i" ]
cp "$1/$i" "$2/$i.old";
fi;
done;
Tu lances ce script par
chmod +x script.sh (a ne faire qu'une fois)
./script.sh source destination
Explications:
Tu listes tout ce qui est dans le repertoire source, et tu le copies dans le repertoire 2.
Je te donnes cette piste (imparfaite), parce que je pense qu'il est une mauvqaise habitude de faire des cd dans un script quand on peut l'eviter.
Maintenant, a toi de voir
Dernière modification par best_friend_fr (Le 14/12/2007, à 20:50)
sudo apt-get replace langage_sms by grammaire orthographe ponctuation
La documentation est avant tout faite pour ceux qui posent les questions, et non ceux qui y répondent
Best_friend_fr
Hors ligne
Pages : 1