I. Renommer un fichier▲
Bien qu'il soit simple de renommer un fichier, il y a certaines subtilités pendant le renommage ou la copie via les fonctions Perl.
Voici un exemple avec la fonction rename de Perl :
#!/usr/bin/perl
use strict;
use warnings;
# /home et /tmp sont sur deux disques différents
my $fichier
=
'/home/djibril/youtube.pl'
;
my $fichier_destination
=
'/tmp/youtube.pl'
;
rename
$fichier
, $fichier_destination
or
die "rename failed: $!"
;
Si le fichier de destination se trouve sur un autre disque physique, sous Linux par exemple, vous aurez ce message : « Lien croisé de périphérique invalide. »
Dans ce cas, la solution consiste à ne pas utiliser cette fonction, mais plutôt la fonction move disponible dans le module File::Copy déjà disponible dans le core de Perl.
#!/usr/bin/perl
use strict;
use warnings;
use File::Copy qw/move/
;
# /home et /tmp sont sur deux disques différents
my $fichier
=
'/home/djibril/youtube.pl'
;
my $fichier_destination
=
'/tmp/youtube.pl'
;
move($fichier
, $fichier_destination
) or
die "move failed: $!"
;
Voilà, souci résolu, quoique, lisez la suite !
II. Copier un fichier▲
Pour copier un fichier en Perl, il n'existe pas de fonction interne à Perl. Vous devez utiliser la fonction copy du module File::Copy. Pas besoin d'installer ce module, il est déjà présent dans le core de Perl. Voici un exemple basique :
/tmp/TEST-COPY# ll
total 12K
drwxr-xr-x 2
root root 4
,0K juil. 24
14
:22
.
drwxrwxrwt 7
root root 4
,0K juil. 24
14
:22
..
-rw------- 1
root root 7
juil. 24
14
:08
fichier1.txt
On constate que l'on a un fichier avec des droits « 600 » sur le fichier « fichier1.txt ». Déplaçons-le :
#!/usr/bin/perl
use strict;
use warnings;
use File::Copy qw/ copy /
;
# /home et /tmp sont sur deux disques différents
my $fichier
=
'/tmp/TEST-COPY/fichier1.txt'
;
my $repertoire
=
'/tmp'
;
copy( $fichier
, $repertoire
) or
die "Copy failed: $!"
;
# ls -alh /tmp/fichier1.txt
-rw-r--r-- 1
root root 7
juil. 24
14
:27
/tmp/fichier1.txt
Les droits sur le fichier ne sont pas conservés. Pour pallier ce souci, le module dispose d'un alias à copy se nommant cp qui conserve les droits.
#!/usr/bin/perl
use strict;
use warnings;
use File::Copy qw/ cp /
;
# /home et /tmp sont sur deux disques différents
my $fichier
=
'/tmp/TEST-COPY/fichier1.txt'
;
my $repertoire
=
'/tmp'
;
cp( $fichier
, $repertoire
) or
die "Copy failed: $!"
;
Après suppression du fichier « /tmp/fichier1.txt », on relance notre programme Perl.
# ls -alh /tmp/fichier1.txt
-rw------- 1
root root 7
juil. 24
15
:15
/tmp/fichier1.txt
Voilà, le problème est résolu !
III. Déplacer un fichier▲
Pour déplacer un fichier en Perl, vous avez au moins trois solutions :
- rename (fonction de Perl). Attention à la remarque ci-dessusRenommer un fichiers ;
- move (issu de File::Copy), mais vous perdrez les droits sur le fichier comme vu ci-dessusCopier un fichier ;
- mv (issu de File::Copy) avec les permissions préservées sur le fichier.
Il est important de garder à l'esprit toutes ces subtilités afin d'éviter de mauvaises surprises.
#!/usr/bin/perl
use strict;
use warnings;
use File::Copy qw/ move mv /
;
my $fichier1
=
'/tmp/TEST-COPY/fichier1.txt'
;
my $fichier2
=
'/tmp/TEST-COPY/fichier2.txt'
;
my $repertoire
=
'/tmp'
;
move( $fichier1
, $repertoire
) or
die "move failed: $!"
;
mv( $fichier2
, $repertoire
) or
die "mv failed: $!"
;