Enlever les accents de tous les fichiers

Contenu du snippet

J'ai rencontré ce problème récemment: les fichiers hébergés en ftp sur un mac passent mal dans un client ftp sous Windows, surtout s'il s'agit d'un client intégré à un navigateur comme IE ou FF. Dans certains cas, on ne peut même pas télécharger du tout. La raison, c'est que les codages des caractères accentués diffèrent d'une machine à l'autre: le mac utilise l'UTF8-MAC, le PC utilise l'ISO-LATIN.

La solution que j'ai trouvée est de supprimer les caractères accentués à l'aide d'une moulinette qui parcourt récursivement le dossier à traiter, en remplaçant si possible ces caractères par leur version non accentuée.

Le source qui est donné ici n'est valable que pour Mac et est en Perl (désolé pour la rubrique Python: le Perl ne semble pas avoir été prévu dans ce site).
Usage "typique": perl desaccentue.pl . : permet d'enlever les accents de tous les fichiers situés dans le dossier courant (celui qui contient le script).

Source / Exemple :


#!/usr/bin/perl

use URI::Escape;

# renomme tout le contenu d'un dossier récursivement en enlevant les accents. Valable pour Mac uniquement (noms des fichiers codés en UTF8-MAC). Usage: perl desaccentue.pl <dossier> [<filtre>]

($#ARGV>=0) or die "Usage: perl desaccentue.pl <dir> [<filtre>]\n";

my $repertoire= $ARGV[0];
my $filtre= $ARGV[1] eq ''? '*' : $ARGV[1];
my $result;
my $expr= "\\.$filtre";
my $nfich=0;
my $nrep=0;
my $i;

&explore($repertoire,'.');

print "\nTotal fichiers: $nfich et total dossiers: $nrep\n";

sub explore {
my $r= shift;
my $c= shift;
my $x;
my $y;

$c .= "/$r";

chdir ($r) || die "$r $!\n"; 

foreach $x (<*>) { 

    $y= uri_escape($x);
    $y =~ s/%CC%..//g;
    $y =~ s/%(..)/pack("C",hex($1))/ge;
    
  if (-d $x)  { &explore($x,$c);  $nrep++; if ($y ne $x) { rename $x,$y } }
    
  elsif ($x =~ /$expr/i) {

      if ($y ne $x) { rename $x,$y }
  }
 } 
 
 chdir ('..') || die "$r $!\n";
}

Conclusion :


Ce script est un premier jet; j'imagine que je ne suis pas le seul à m'être penché sur ce problème. La version pour PC étant trop bugguée et ne présentant pas d'intérêt pour qui n'a pas téléchargé ActivePerl, je ne la mets pas. Me mailer si vous en voulez!

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.