Deplacement de fichiers avec horodatage

Fermé
dino - 14 mai 2014 à 11:10
 Utilisateur anonyme - 15 mai 2014 à 08:51
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


A voir également:

6 réponses

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
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
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 419
14 mai 2014 à 12:32
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
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
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 419
14 mai 2014 à 13:14
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
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 419
14 mai 2014 à 13:30
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
Utilisateur anonyme
14 mai 2014 à 14:09
merci,
mais pourquoi pas z'ici ???
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 419
14 mai 2014 à 14:26
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
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
Utilisateur anonyme
14 mai 2014 à 16:02
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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Par ce que j'ai plusieurs repertoire ,et je met le chemin absolu dans un fichier que je lis ligne par ligne
0
Utilisateur anonyme
14 mai 2014 à 16:41
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
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
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