Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#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 *

synthia36 a écrit :

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 tongue

Hors ligne

#22 Le 14/12/2007, à 13:52

coca25

Re : script shell sous linux

synthia36 a écrit :

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