Comment renommer, copier ou déplacer un fichier proprement en Perl ?

djibril

Renommer, copier ou déplacer des fichiers reste basique en Perl, mais il y a des subtilités à connaître pour éviter de mauvaises surprises.

Commentez

- Titre : Comment renommer, copier ou déplacer un fichier proprement en Perl ?

- Auteur : djibril

- Parution : 24 juillet 2014

- Licence : Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2014 djibril. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

Sommaire

- I. Renommer un fichier

- II. Copier un fichier

- III. Déplacer un fichier

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 :

Renommer un fichier

#!/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.

Renommer le fichier en utilisant move

#!/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 :

Droit sur le fichier

/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 :

Copie du fichier - copy

#!/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: $!";

Résultat - copy

# 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.

cp

#!/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 :

1. rename (fonction de Perl). Attention à la remarque ci-dessus ;

2. move (issu de File::Copy), mais vous perdrez les droits sur le fichier comme vu ci-dessus ;

3. 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.

Exemple de code

#!/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: $!";