Problème cp d'un directory avec des fichiers

Fermé
r4ven Messages postés 2 Date d'inscription vendredi 9 mai 2014 Statut Membre Dernière intervention 12 mai 2014 - Modifié par jipicy le 9/05/2014 à 19:00
adrien1975 Messages postés 55 Date d'inscription lundi 21 février 2011 Statut Membre Dernière intervention 27 mai 2014 - 19 mai 2014 à 01:24
Bonjour et bien voilà je suis étudiant en premiere en bac info et j'ai quelque exercices à faire sous linux ( centOS 6.5 ) je travail sous bash je vous explique ce qui ne va pas

l'exercice :

copier un repertoire Photos ( chmod 777 sur le dossier ) contenant : index.html photo1.jpg photo2.jpg photo3.jpg ( ce sont des fichiers nommé comme si c'était des photos ) et je dois les copier avec un script appellé ex5.sh qui va tout seul copié le dossier Photos en Photo_save et tout ce que contient mon dossier Photos sera a l'interieure copié dans le dossier de destination avec _save a la fin ( index.html_save...) il faudra aussi appeller le dossier de départ SOURCE_DIR et le dossier de reception DEST_DIR

cela ce présente comme suit à ca réussite:

./ex5.sh Photo
création d'un répertoire Photos_save
copie de Photos.index.html dans Photos_save/index.html_save
copie de Photos.photo1.jpg dans Photos_save/photo1.jpg_save
copie de Photos.photo2.jpg dans Photos_save/photo2.jpg_save
copie de Photos.photo3.jpg dans Photos_save/photo3.jpg_save


alors je vous copie mon code ( celui du script nommé ex5.sh )

#!/bin/bash

SOURCE_DIR=$1
DEST_DIR=$1_save

echo " Création du répertoire $DEST_DIR "

mkdir $DEST_DIR

for i in $(ls $SOURCE_DIR/*.*)
do
        cp $i $1_save/$i_save
        echo " copie de $SOURCE_DIR/$i dans $DEST_DIR/$i_save "
done


Alors le probleme que j'ai c'est que il fait bien un repertoire Photos_save mais à l'intérieur il ne met pas index.html_save il copie tout tel quel mais sans les _save pour les fichier contenu dans le dossier

la peut etre que 1 ou 2 petite choses ne vont pas non plus mais j ai essaye 300.000 trucs alors j'ai plus les idée claires lol

Merci d'avance

R4ven
A voir également:

3 réponses

r4ven Messages postés 2 Date d'inscription vendredi 9 mai 2014 Statut Membre Dernière intervention 12 mai 2014
12 mai 2014 à 11:57
Yop, alors grand merci de m'avoir répondu :)

J'ai essayé " for i in ${SOURCE_DIR}/* " mais il me dit "Mauvaise substitution"

puis pour le "${i}" "${DEST_DIR}/${i#*/}_save" j'ai une question ( et j'ai essayer mais à mon avis je ne comprends pas bien comment l'insérer dans mon code ) et pq mettre des {} au lieu de () ??

Merci d'avance encore une fois :)
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 408
12 mai 2014 à 16:44
$ tree
.
|-- foo.sh
'-- Photos
|-- index.html
|-- photo1.jpg
|-- photo2.jpg
|-- photo3.jpg
'-- photo4.jpg

1 directory, 6 files

$ cat foo.sh
#!/bin/bash

if test -z "${1}"
then
echo "Paramètre absent. Fin du programme"
exit
fi

SOURCE_DIR="${1}"
DEST_DIR="${1}_save"

echo "Création du répertoire $DEST_DIR "

mkdir -p "${DEST_DIR}"

for i in ${SOURCE_DIR}/*
do
cp "${i}" "${DEST_DIR}/${i#*/}_save" && \
echo " copie de ${i} dans ${DEST_DIR}/${i#*/}_save "
done

$ ./foo.sh Photos
Création du répertoire Photos_save
copie de Photos/index.html dans Photos_save/index.html_save
copie de Photos/photo1.jpg dans Photos_save/photo1.jpg_save
copie de Photos/photo2.jpg dans Photos_save/photo2.jpg_save
copie de Photos/photo3.jpg dans Photos_save/photo3.jpg_save
copie de Photos/photo4.jpg dans Photos_save/photo4.jpg_save

$ tree
.
|-- foo.sh
|-- Photos
| |-- index.html
| |-- photo1.jpg
| |-- photo2.jpg
| |-- photo3.jpg
| '-- photo4.jpg
'-- Photos_save
|-- index.html_save
|-- photo1.jpg_save
|-- photo2.jpg_save
|-- photo3.jpg_save
'-- photo4.jpg_save

2 directories, 11 files
0
adrien1975 Messages postés 55 Date d'inscription lundi 21 février 2011 Statut Membre Dernière intervention 27 mai 2014 1
19 mai 2014 à 01:24
Je dit ptet nimporte quoi mais il faudrait pas remplacer $i_save par "$i"_save et pareil avec $1 pour la command cp ?
0
ElementW Messages postés 4816 Date d'inscription dimanche 12 juin 2011 Statut Contributeur Dernière intervention 5 octobre 2021 1 225
Modifié par gravgun le 9/05/2014 à 19:42
'lut, ça marche pas parce que
ls $SOURCE_DIR/*.*
te donne le nom des fichiers avec le nom du dossier
$SOURCE_DIR
devant.
Du coup faut faire en sorte que LS produise une liste de fichiers sans le nom:
for i in $(cd $SOURCE_DIR;ls *.*)

Mais du coup CP ne saura plus copier... à cause de la source, il faut donc lui re-préciser le dossier à chaque fois:
cp "$SOURCE_DIR/$i" "$DEST_DIR/${i}_save"

Constate que j'ai mis la forme longue d'expression des variables dans le 2e paramètre pour éviter toute ambigüité avec le "_save" derrière.
Pour le coup du CD dans le $(), je sais pas si c'est une bonne pratique ou pas, si toi, lecteur de ce post, est un
bash
iste, libre à toi de me gueuler dessus si ce n'est pas le cas.

from human import idiocy
del idiocy
-1
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 408
9 mai 2014 à 20:11
Salut,

Pour le coup du CD dans le $(), je sais pas si c'est une bonne pratique ou pas, si toi, lecteur de ce post, est un bashiste, libre à toi de me gueuler dessus si ce n'est pas le cas.
Ce n'est pas tellement le
cd rep
qui est gênant, mais plutôt le
ls *.*
qui est à proscrire, ne serait-ce qu'en cas d'espace dans un nom ;-(

Mieux vaut privilégier un
for i in ${SOURCE_DIR}/*
beaucoup plus opportun.

Quant au problème du nom du répertoire, il suffit de jouer avec le remplacement des paramètres
cp "${i}" "${DEST_DIR}/${i#*/}_save"
qui produira l'effet escompté ;-))

$ ./foo.sh photos
Création du répertoire photos_save
copie de photos/index.html dans photos_save/index.html_save
copie de photos/photo1.jpg dans photos_save/photo1.jpg_save
copie de photos/photo2.jpg dans photos_save/photo2.jpg_save
copie de photos/photo3.jpg dans photos_save/photo3.jpg_save
copie de photos/photo4.jpg dans photos_save/photo4.jpg_save
0