Copier un fichier dans un autre repertoire avec Perl [Résolu/Fermé]

Signaler
-
 perl2013 -
Bonjour,

Je suis neophype en programmation perl, actuellement j'ecris un petit script qui m'aidera à copier un fichier dans un autre repertoire.

L'idée de mon script est de lister tous le fichiers et leur chemin ligne par ligne dans un fichier.
Exemple:
/home/test/cpo1
/etc/col/cpo2
/curentrep/cpo3

Mon script va scruter le fichier ligne par ligne et va indexer chaque ligne comme un fichier pour le recopier dans un autre repertoire.

Voici ce que j'ai déja concocté et qui ne marche toujours pas:

************************
my $i;
my $path;
my $files;

system("cp test01 bliz");

$i = 0;

open(FILE, fichiers);
while($files=<FILE>){
while ($i<5){

$path = "bliz".$i;
$lpath = "/home/test/perlTraining/olddata/".$path;
system("cp $files $lpath");
$i = $i + 1;
}
}
close(FILE);
print "OK";

**********************************************

J'ai remarqué qu'une erreur se glisse quand j'ajoute la boucle while($files=<FILE>)...

cp: missing destination file operand after 'cpo1'
Try 'cp --help' for more information.
sh: 2: /home/test/perlTraining/olddata/bliz0: not found
cp: missing destination file operand after 'cpo1'
Try 'cp --help' for more information
...

*****************
Avant que cette erreur apparaisse, j'avais un fichier statique "fichierTest" en lieu et place de $files. Et tout marchait correctement.


Je continue de bucher sur ce soucis, prière m'aider SVP.



En attente de reponse .


2 réponses

Messages postés
5528
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
5 mai 2021
933
Salut perl2013,

Il y a beaucoup d'erreurs et d'incohérences dans ton code.

En précédant ton code de :

use strict;
use warnings;

ton code ne compile pas, avec plusieurs erreurs, dont tu devrais déterminer la cause pour les corriger.

system("cp test01 bliz");

je ne vois pas à quoi cela sert

open(FILE, fichiers);

on sait pas ce qu'est fichiers, ce n'est pas une variable en tout cas, et ta syntaxe de open n'est pas conforme à la documentation : https://perldoc.perl.org/functions/open en revanche, cette syntaxe fonctionnerait :

open(FILE, "</chemin/vers/ma/liste_de_fichiers.txt");

dans le while($files=<FILE>) tu dois probablement faire un :

chomp($files);

sinon, tu prends aussi le retour à la ligne, ce qui peut expliquer que tes commandes cp ne fonctionnement pas, d'ailleurs, puisque la concaténation dans system("cp $files $lpath"); va inclure le retour à la ligne à la fin de $files et :
- le 2ème argument sera manquant pour cp,
- le 2ème argument va se retrouver tout seul dans une nouvelle ligne envoyée au shell, qui ne saura pas quoi en faire, car ce n'est pas une commande système.

tu déclares toutes tes variables, mais pas $lpath. En mode "strict" ton programme ne passe pas. Donc :

 my $lpath = "...

tu fais un while ($i<5) à l'intérieur de ta boucle principale. je ne vois pas à quoi elle sert. Elle ne fait que répéter la copie du premier fichier trouvé dans le fichier texte 4 fois sous 4 noms différents. Pour les fichiers suivants trouvés dans le fichier texte, aucune copie n'a lieu, car $i dépasse 4. Ce n'est pas ce que tu veux faire. Supprime ce while.

Si ce que tu veux, c'est arrêter le while de ta boucle principale si 4 lignes du fichier texte ont été traitées, tu utilises last (https://perldoc.perl.org/functions/last) dans ta boucle while

last if ($i == 4);

Enfin, pour copier des fichiers, en Perl, au lieu d'utiliser system et de lancer une commande par le shell, tu peux utiliser la fonction Perl copy après avoir inclus use File::Copy; dans tes directives.

https://perldoc.perl.org/File::Copy

Ton programme sera portable et en prime tu peux gérer les erreurs avec un message explicite.

copy($files, $lpath) or die "La copie a échoué : $!";

Tu as les éléments pour finaliser ton code, mais je te conseille vraiment de revoir les bases et d'être plus rigoureux.


Dal
Bonjour DAL,

j'ai oublié de reviser le code que je devais vs presenter.

l'erreur se trouvait au niveau du chomp(..files).



Merci pour les conseils...

j'en tiendrai compte