Script copie fichiers

Fermé
yankeekfp Messages postés 6 Date d'inscription vendredi 10 mai 2013 Statut Membre Dernière intervention 10 mai 2013 - 10 mai 2013 à 20:51
yankeekfp Messages postés 6 Date d'inscription vendredi 10 mai 2013 Statut Membre Dernière intervention 10 mai 2013 - 10 mai 2013 à 23:13
Bonjour,

Je cherche à créer un script linux qui permet de copier un ou plusieurs fichiers dans un ou plusieurs repertoires de destination. Les deux listes (fichiers à copier et repertoire de destination) doivent être séparées par le caractère ":".

Je vous remercie pour votre aide.


A voir également:

10 réponses

Salut,

man cp peut aider.
man cut

Et je pense que tu as tout ce qu'il faut si tu connais les bases (genre $1=premier argument, $2 le deuxième...)

N'hésite pas à donner plus de détails si tu veux plus d'explications.
0
yankeekfp Messages postés 6 Date d'inscription vendredi 10 mai 2013 Statut Membre Dernière intervention 10 mai 2013
10 mai 2013 à 21:06
Salut,

Le nombre d'argument ne doit pas être spécifié dans le script. L'utilisateur peut peut vouloir faire la copie de 12 fichiers dans différents répertoires. La copie se fera de manière récursive, c'est à dire dans tous les repertoires de destinations.

De plus, je me demande comment faire pour que le séparateur ":" soit pris en compte dans le script pour distinguer la partie à gauche correspond aux fichiers à copier et la partie de droite aux répertoires de destination.

Merci pour ton aide
0
Juste une piste (c'est comme ça que je ferais)
En utilisant le ":" comme séparateur et en prenant tout ce qui va avant (man cut)
cut [arguments] laListe > source.txt     

En utilisant le ":" comme séparateur et en prenant tout ce qui va après (man cut)
cut [arguments] laListe > cible.txt     

Ensuite j'utiliserais une commande sed pour remplacer les espaces (si ce sont des espaces qui séparent les fichiers) par des retours chariots dans les deux fichiers (man sed)
En suite je ferais un truc du genre
while read source     
do     
     while read cible     
     do     
          cp -p ${source} ${cible}     
     done<cible.txt     
done<source.txt     

C'est peut-être pas le plus simple mais ça doit marcher
0
yankeekfp Messages postés 6 Date d'inscription vendredi 10 mai 2013 Statut Membre Dernière intervention 10 mai 2013
10 mai 2013 à 21:34
J'ai analysé la solution que je trouve très intéressante.

Si j'arrive à extraire la partie avant le ":" et celle après le ":". Est-ce qu'il ne serait pas plus simple de les affecter à une variable de type source="la partie avant" et destination="la partie après"?

Ensuite, une fois que c'est fait, j'ai juste besoin de faire cp -r $source $destination.

Qu'en penses-tu?
0

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

Posez votre question
Sur le principe oui tu peux le mettre dans un variable...
Mais pour la suite je te suis pas trop, au-delà de deux arguments ton cp va te hurler dessus (s'il y a plusieurs fichiers/répertoires dans source et cible).
Le cp -r c'est plutôt pour copier les arborescences, pas les fichiers isolés. cp -p te permettra de copier le fichier à l'identique (avec date de création, de dernier accès...)
Pour exploiter ton idée de la variable tu dois pouvoir utiliser des tableaux et faire un genre de "split"... mais j'ai jamais fait.
0
yankeekfp Messages postés 6 Date d'inscription vendredi 10 mai 2013 Statut Membre Dernière intervention 10 mai 2013
10 mai 2013 à 21:59
Oui tu as raison. Je suis donc encore loin de la solution :-).
Le script que tu proposes est surement la solution au problème. Pourrais-tu me l'ecrire en entier? J'ai du mal a suivre pour extraire avant et après le ":".

La commande "read" est pour lire un texte saisie au clavier je crois. Si oui, comment l'interpreteur shell va faire pour traiter ca dans un fichier?

Merci encore
0
Pierre8888 Messages postés 1053 Date d'inscription mercredi 17 octobre 2012 Statut Membre Dernière intervention 17 mai 2015 165
Modifié par Pierre8888 le 10/05/2013 à 23:03
Bonjour quel gestionnaire de fichiers à tu ?
Un passionné de Linux : Acer Aspire X1430-005 AMD radeon HD 6310 Xubuntu 12.04 LTS / Asus - X73BR AMD 7470M Kubuntu 12.10 / Acer Aspire X1430-005 AMD radeon HD 6310 Ubuntu 12.10 Gnome.
0
En supposant que ta liste soit dans un fichier "list.txt"
Avant le :
cut -d: -f1 list.txt > source.txt

Après le :
cut -d: -f2 list.txt > cible.txt

http://www.linuxcertif.com/doc/keyword/cut/
Ensuite
sed "s+ +\n+g" source.txt sourceFinale.txt  
idem pour cible  

avec le code que je t'ai donné tout à l'heure, tu mets tout ça dans un sh, et tu lances.
Bien sûr tu peux faire des rm des fichiers créés pour faire propre.

En revanche là je suis sus Windows donc j'ai pas pu tester... donc y a peut-être deux trois trucs à modifier...

Pour le read c'est un truc que j'utilisais quand je faisais du Korn Shell (ksh). Ecrit comme ça dans un script ça lit ligne par ligne le fichier dirigé dans le done (done<Lefichier). Je pense que ça doit être universel comme syntaxe...
0
yankeekfp Messages postés 6 Date d'inscription vendredi 10 mai 2013 Statut Membre Dernière intervention 10 mai 2013
10 mai 2013 à 22:33
Je n'ai pas tres bien compris ta question, mais j'utilise RedHat.

Merci
0
yankeekfp Messages postés 6 Date d'inscription vendredi 10 mai 2013 Statut Membre Dernière intervention 10 mai 2013
10 mai 2013 à 23:13
Je vais tester tout ça.Juste un point, ma liste ne sera pas dans un fichier mais sera passé en argument à l'exécution du script. Par exemple, l'utilisateur mettra
$scriptcopie fic1 fic2 fic3 fic4 : rep1 rep2 rep3 rep4 rep5 rep6.

Pour prendre en compte cette liste, est-ce que je peux utiliser
echo "Donner les deux listes: $*"

Merci.
0