Deplacement de fichiers avec horodatage

dino -  
 Utilisateur anonyme -
Bonjour,
je voudrais mettre en place un script qui copie ou deplace tout les fichiers presents dans certain repertoires present dans un repertoire connu ,en ajoutant un horodatage a la fin des fichiers.
J'ai pensé a ca :
cat listrep.txt :
chemin 1
chemin 2
chemin 3
Archive=
DATE='date +"%d/%m/%Y-%H%M%S"'
for i in 'cat list_rep.txt' ; do
cp -Rp "chemin"/$i/* Archive/$i/*_$DATE
done
mais comment donner le nom du fichier sauvegarder avec l'extention de DATE a chaque fichier ?
Merci a tous

6 réponses

  1. Utilisateur anonyme
     
    salut,

    UUOC !
    for
    boucle sur chaque mot, pas sur chaque ligne. :(

    while read line
    do echo "line"
    done < fichier

    mais comment donner le nom du fichier sauvegarder avec l'extention de DATE a chaque fichier ?
    while read -r fichier
    do cp -p fichier /destination/$(basename "$fichier")_$Date
    done < fichier.txt

    pourquoi le nom des fichiers à copier sont-ils dans un fichier ?
    0
  2. dino
     
    Merci pour ta reponse !

    Mais ,je n'ai pas le nom des fichiers ,par contre leurs endroit oui ,du coup j'ai mis le chemin absolus de chaque repertoire dans un fichier listrep.txt.
    Le script va lire chaque chemin ,et deplaceras tout le contenue dans mon archive.

    ce qui reste c'est donner l'extention "$DATE" a chaque fichier deplacés.

    qd tu ecris :
    "cp -p fichier /destination/$(basename "$fichier")_$Date"

    je n'ai pas le nom de "fichier"

    je pense a un "find" :

    find $i -type f exec cp {} ARCHIVE/ \;

    mais mettre quoi comme nom apres ARCHIVE/"?????" pour avoir les meme fichiers avec "_DATE" ?

    Merci
    0
  3. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
     
    Salut,

    $ tree rep/     # arborescence
    rep/
    |-- A
    | |-- tata
    | '-- toto
    |-- B
    | '-- titi
    '-- C
    '-- tutu

    3 directories, 4 files

    # Création variable date
    $ DATE=$(date +"%d-%m-%Y_%H%M%S")

    # La commande avec cp en mode verbeux
    $ for i in $(find rep -depth -type d);do cp -b -Rvp -S "_${DATE}" --parents "${i}" backup ;done
    rep -> backup/rep
    «rep/C» -> «backup/rep/C»
    «rep/C/tutu» -> «backup/rep/C/tutu»
    «rep/B» -> «backup/rep/B»
    «rep/B/titi» -> «backup/rep/B/titi»
    «rep/A» -> «backup/rep/A»
    «rep/A/tata» -> «backup/rep/A/tata»
    «rep/A/toto» -> «backup/rep/A/toto»
    «rep/C/tutu» -> «backup/rep/C/tutu» (archive : «backup/rep/C/tutu_14-05-2014_122634»)
    «rep/B/titi» -> «backup/rep/B/titi» (archive : «backup/rep/B/titi_14-05-2014_122634»)
    «rep/A/tata» -> «backup/rep/A/tata» (archive : «backup/rep/A/tata_14-05-2014_122634»)
    «rep/A/toto» -> «backup/rep/A/toto» (archive : «backup/rep/A/toto_14-05-2014_122634»)

    # Le contenu du backup
    $ tree backup/
    backup/
    '-- rep
    |-- A
    | |-- tata
    | |-- tata_14-05-2014_122634
    | |-- toto
    | '-- toto_14-05-2014_122634
    |-- B
    | |-- titi
    | '-- titi_14-05-2014_122634
    '-- C
    |-- tutu
    '-- tutu_14-05-2014_122634

    4 directories, 8 files

    # On initie à nouveau la variable DATE
    $ DATE=$(date +"%d-%m-%Y_%H%M%S")

    # Et on relance la commande
    $ for i in $(find rep -depth -type d);do cp -b -Rvp -S "_${DATE}" --parents "${i}" backup ;done
    «rep/C/tutu» -> «backup/rep/C/tutu» (archive : «backup/rep/C/tutu_14-05-2014_122706»)
    «rep/B/titi» -> «backup/rep/B/titi» (archive : «backup/rep/B/titi_14-05-2014_122706»)
    «rep/A/tata» -> «backup/rep/A/tata» (archive : «backup/rep/A/tata_14-05-2014_122706»)
    «rep/A/toto» -> «backup/rep/A/toto» (archive : «backup/rep/A/toto_14-05-2014_122706»)
    «rep/C/tutu» -> «backup/rep/C/tutu» (archive : «backup/rep/C/tutu_14-05-2014_122706»)
    «rep/B/titi» -> «backup/rep/B/titi» (archive : «backup/rep/B/titi_14-05-2014_122706»)
    «rep/A/tata» -> «backup/rep/A/tata» (archive : «backup/rep/A/tata_14-05-2014_122706»)
    «rep/A/toto» -> «backup/rep/A/toto» (archive : «backup/rep/A/toto_14-05-2014_122706»)

    # Nouveau contenu du backup
    $ tree backup/
    backup/
    '-- rep
    |-- A
    | |-- tata
    | |-- tata_14-05-2014_122634
    | |-- tata_14-05-2014_122706
    | |-- toto
    | |-- toto_14-05-2014_122634
    | '-- toto_14-05-2014_122706
    |-- B
    | |-- titi
    | |-- titi_14-05-2014_122634
    | '-- titi_14-05-2014_122706
    '-- C
    |-- tutu
    |-- tutu_14-05-2014_122634
    '-- tutu_14-05-2014_122706

    4 directories, 12 files

    0
    1. Utilisateur anonyme
       
      ah, non ! zipe31 pas toi !
      grrr
      for i in $(commande)
      tu le sais pourtant que <litanie>si les noms de fichiers contiennent un espace...</litanie>
      0
    2. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      Meuh non, pas z'ici ;-))

      $ tree rep/
      rep/
      |-- A
      | |-- le fichier à trou
      | |-- tata
      | '-- toto
      |-- B
      | '-- titi
      '-- C
      '-- tutu

      3 directories, 5 files

      $ for i in $(find rep -depth -type d);do cp -b -Rvp -S "_${DATE}" --parents "${i}" backup ;done
      rep -> backup/rep
      «rep/C» -> «backup/rep/C»
      «rep/C/tutu» -> «backup/rep/C/tutu»
      «rep/B» -> «backup/rep/B»
      «rep/B/titi» -> «backup/rep/B/titi»
      «rep/A» -> «backup/rep/A»
      «rep/A/le fichier à trou» -> «backup/rep/A/le fichier à trou»
      «rep/A/tata» -> «backup/rep/A/tata»
      «rep/A/toto» -> «backup/rep/A/toto»
      «rep/C/tutu» -> «backup/rep/C/tutu» (archive : «backup/rep/C/tutu_14-05-2014_122706»)
      «rep/B/titi» -> «backup/rep/B/titi» (archive : «backup/rep/B/titi_14-05-2014_122706»)
      «rep/A/le fichier à trou» -> «backup/rep/A/le fichier à trou» (archive : «backup/rep/A/le fichier à trou_14-05-2014_122706»)
      «rep/A/tata» -> «backup/rep/A/tata» (archive : «backup/rep/A/tata_14-05-2014_122706»)
      «rep/A/toto» -> «backup/rep/A/toto» (archive : «backup/rep/A/toto_14-05-2014_122706»)

      $ tree backup/
      backup/
      '-- rep
      |-- A
      | |-- le fichier à trou
      | |-- le fichier à trou_14-05-2014_122706
      | |-- tata
      | |-- tata_14-05-2014_122706
      | |-- toto
      | '-- toto_14-05-2014_122706
      |-- B
      | |-- titi
      | '-- titi_14-05-2014_122706
      '-- C
      |-- tutu
      '-- tutu_14-05-2014_122706

      4 directories, 10 files
      0
    3. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      Bon allez, une spéciale dédicace à qcqcpQ :
      while read i;do cp -b -Rvp -S "_${DATE}" --parents "${i}" backup;done < <(find rep -depth -type d)
      

      ;-))
      0
    4. Utilisateur anonyme
       
      merci,
      mais pourquoi pas z'ici ???
      0
    5. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      Because of that tu le sais pourtant que <litanie>si les noms de fichiers contiennent un espace...</litanie>, la preuve que ça passe bien ;-))

      C'est surtout valable en de
      ls *
      . Après je reconnais que tu es dans le vrai.
      0
  4. dino
     
    Merci a tous ,

    entre temps j'ai fais ca et ca fct :

    for i in 'cat list_rep.txt' ; do
    for j in 'ls -1 "CHEMIN1/$i' ; do

    cp -Rp $CHEMIN1/$i/$j ARCHIVE/$i/$(basename $j)_'date +"%Y-%m%d-%H.%M.%S"'

    done

    done

    Mais a vous lire ,c vrai que cette methode a ses limites ne va pas plus loin qu'un sou repertoire.

    Merci a tous !
    0
    1. Utilisateur anonyme
       
      y en a qui cherche les coups !?

      while read -r chemin
      do
      for i in "$chemin"/*
      do
      test -d "$CHEMIN/$chemin" || mkdir "$CHEMIN/$chemin"
      cp -p "$CHEMIN/$chemin/$fichier" Archive/$chemin/${fichier##/*}_$(date +'%Y-%m%d-%H.%M.%S')
      done
      done < list_rep.txt

      mais, tu n'as pas répondu : pourquoi le noms des chemins sont-ils dans un fichier ?
      0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. dino
     
    Par ce que j'ai plusieurs repertoire ,et je met le chemin absolu dans un fichier que je lis ligne par ligne
    0
    1. Utilisateur anonyme
       
      y en a beaucoup ?
      tu pourrais faire une boucle, ça économiserait les accès disque :
      for chemin in /chemin/chemin/1/* /chemin/chemin2/2/*; do ...; done

      tu travailles sur bash ? on pourrait optimiser.
      le script doit être portable ? on ne peut pas changer ce que j'ai écrit.
      0
  7. dino
     
    Bonjour,

    Je suis en ksh et j'ai plusieurs repertoires.

    Pour ta proposition :
    - "while read -r chemin "

    j'ai plusieurs chemins

    - "cp -p "$CHEMIN/$chemin/$fichier" Archive/$chemin/${fichier##/*}_$(date +'%Y-%m%d-%H.%M.%S')"

    ${fichier##/*} : c'est le nom du fichier finale a la sauvegarde ?

    Merci
    0
    1. Utilisateur anonyme
       
      while read -r chemin
      va lire chaque ligne du fichier, la mettre dans la variable
      chemin
      , et exécuter
      cp
      .

      ${fichier##motif}
      est un développement de variable qui permet de ne pas appeler de commande externe, qui n'affiche pas ce qui précéde le motif (c'est dans le
      man
      : Retrait du motif correspondant au préfixe).
      par exemple:
      $ var=abcdbe             
      $ echo ${var##*b}
      e
      $ echo ${var#*b}
      cdbe
      d'ailleurs, attention, je me suis trompé, ça doit être :
      ${chemin##*/}
      :(

      tu trouveras aussi dans le
      man
      le développement des accolades, et donc au lieu d'utiliser un fichier, si tu n'as pas trop de chemins à explorer (ça peut devenir illisible), tu peux "résumer" des expressions, ainsi :
      /chemin/{chemin1,ch{1,2,N}}/
      est développé en
      /chemin/chemin1/ /chemin/ch1 /chemin/ch2/ /chemin/chN
      :)
      et donc
      for rep in /racine/{chemin_1,chemin_2,chemin_N}/
      do echo "traitement de $rep"
      done
      peut éviter le recours à un fichier.
      0