Problème cp d'un directory avec des fichiers

r4ven Messages postés 2 Statut Membre -  
adrien1975 Messages postés 63 Statut Membre -
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

3 réponses

  1. r4ven Messages postés 2 Statut Membre
     
    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
    1. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      $ 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
  2. adrien1975 Messages postés 63 Statut Membre 1
     
    Je dit ptet nimporte quoi mais il faudrait pas remplacer $i_save par "$i"_save et pareil avec $1 pour la command cp ?
    0
  3. ElementW Messages postés 5690 Statut Contributeur 1 293
     
    '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
    1. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      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