Script de renommage massif

batsoleil

Membre confirmé
5 Mai 2009
10
0
Bonjour,

Suite à la migration d'un MAC OS Serveur très ancien vers un serveur Windows, il est apparu le problème suivant, comment renommer en masse
- des dossiers avec un "." à la fin de leurs noms
- des dossiers et des fichiers avec un espace à la fin de leurs noms
le tout sans bousiller les extentions des fichiers ou les espaces situés ailleurs dans les noms...

A noter qu'avant la migration, j'avais déjà du utiliser le script suivant pour "mettre au norme" les noms des fichiers :
Bloc de code:
#!/usr/bin/perl -w
# This script renames all the files supplied as command-line args
# where necessary so that the filename is acceptable to MS Windows
# Cameron Hayne ([EMAIL="[email protected]"][email protected][/EMAIL]), June 2004
use strict;
chomp(@ARGV = <STDIN>) unless @ARGV;
# The Microsoft document at
# [URL]http://support.microsoft.com/default...b;EN-US;100108[/URL]
# says that the following characters are not allowed in filenames
# in each of the specified filesystems:
# FAT:   .  "  /  \  [  ]  |  :  ;  ,  =
# NTFS:  ?  "  /  \  <  >  |  :  *
# We don't do anything with the dot (.) since it clearly is allowable
# in spite of what that document says.
# And we don't do anything with the slash (/) since that character
# will not occur in OS X filenames and modifying it would cause
# troubles when a file path (with directories) is specified.
# The changing of the filenames is done via the 'tr' statements below.
# Each occurence of a character in the first curly brackets
# is replaced by the character in the second curly brackets.
foreach my $filename (@ARGV)
{
    my $orig_filename = $filename;
    $filename =~ tr{\\}{-};
    $filename =~ tr{*?}{X};
    $filename =~ tr{"><[]|:;,=}{_};
    unless ($filename eq $orig_filename)
    {
 print "About to rename $orig_filename to $filename\n";
 if (-e $filename)
 {
     print "Oops, there already exists a file named $filename\n";
#     print "Skipping the rename - you will have to do it manually\n";
 }
 else
 {
     rename($orig_filename, $filename);
 }
    }
}

Question hors sujet de cette sous partie mais qui va avec : comment restreindre les conventions de nommage de fichier pour les clients MACs sur le serveur Windows, afin de ne pas avoir à nouveau ce genre de soucis :rateau:...

Merci :cool:
 
Bonjour,

Suite à la migration d'un MAC OS Serveur très ancien vers un serveur Windows, il est apparu le problème suivant, comment renommer en masse
- des dossiers avec un "." à la fin de leurs noms
- des dossiers et des fichiers avec un espace à la fin de leurs noms
le tout sans bousiller les extentions des fichiers ou les espaces situés ailleurs dans les noms...

A noter qu'avant la migration, j'avais déjà du utiliser le script suivant pour "mettre au norme" les noms des fichiers :
Bloc de code:
#!/usr/bin/perl -w
# This script renames all the files supplied as command-line args
# where necessary so that the filename is acceptable to MS Windows
# Cameron Hayne ([EMAIL="[email protected]"][email protected][/EMAIL]), June 2004
use strict;
chomp(@ARGV = <STDIN>) unless @ARGV;
# The Microsoft document at
# [URL]http://support.microsoft.com/default...b;EN-US;100108[/URL]
# says that the following characters are not allowed in filenames
# in each of the specified filesystems:
# FAT:   .  "  /  \  [  ]  |  :  ;  ,  =
# NTFS:  ?  "  /  \  <  >  |  :  *
# We don't do anything with the dot (.) since it clearly is allowable
# in spite of what that document says.
# And we don't do anything with the slash (/) since that character
# will not occur in OS X filenames and modifying it would cause
# troubles when a file path (with directories) is specified.
# The changing of the filenames is done via the 'tr' statements below.
# Each occurence of a character in the first curly brackets
# is replaced by the character in the second curly brackets.
foreach my $filename (@ARGV)
{
    my $orig_filename = $filename;
    $filename =~ tr{\\}{-};
    $filename =~ tr{*?}{X};
    $filename =~ tr{"><[]|:;,=}{_};
    unless ($filename eq $orig_filename)
    {
 print "About to rename $orig_filename to $filename\n";
 if (-e $filename)
 {
     print "Oops, there already exists a file named $filename\n";
#     print "Skipping the rename - you will have to do it manually\n";
 }
 else
 {
     rename($orig_filename, $filename);
 }
    }
}
Question hors sujet de cette sous partie mais qui va avec : comment restreindre les conventions de nommage de fichier pour les clients MACs sur le serveur Windows, afin de ne pas avoir à nouveau ce genre de soucis :rateau:...

Merci :cool:

migrer sur un OS descent un linux ou une BSD ou solaris
 
Je ne suis pas un pro du perl je laisse généralement ça aux autres mais si j'ai bien compris tu cherches à renommer les fichiers qui possèdent des espaces et des points ? :p :D :D
 
Un peu, parce que déjà il ne faut pas qu'il touche aux espaces ailleurs dans le nom, ni aux extentions des fichiers.
Je vais essayer avec le regex "$" pour voir...
 
En effet il te suffit de lister les noms de tes fichiers ou dossier contenant un . ou un espace puis avec une commande sed de supprimer les . et espaces à la fin grâce au caractère $ :p :D :D
 
1) tester tout les cas
Bloc de code:
touch "test1"
touch "test2.txt"
touch "test3."
touch "test4 .txt"
touch "test5 .txt "
touch "test6 ."
mkdir "test7"
mkdir "test8.txt"
mkdir "test9."
mkdir "test10 .txt"
mkdir "test11 .txt "
mkdir "test12 ."

2a) trouver les bons regex avec find : fichier&dossier avec un "." à la fin

Bloc de code:
 find . -regex '.*\.$'
.
./test12 .
./test3.
./test6 .
./test9.
=> trouver comment virer le "." du répertoire courant

2b) trouver les bons regex avec find : fichier&dossier avec un "espace" à la fin

Bloc de code:
find . -regex '.*\ $'

./test11 .txt
./test5 .txt

=> RAS

3)Faire pareil avec "tr" (cf script de départ) pour supprimer à la volée dans une arborescence

Euh là c'est plus dur :(:(
*pas habitué au regex*
 
Rien du tout pour l'instant, j'en ai pas vu parmi les 250 000 fichiers en magasin.
*verra plus tard pour ce cas là*
*cherche toujour le "tr" qui va bien pour les deux autres cas* :siffle:
 
ok je vais etre franco, j'ai joué, si j'ai un admin qui rename les fichiers quand il backup au lieu de quoter et de backslasher ses paths sur le shell courant et le remote je lui fou un coup de pied au cul ou trouve un manche a balais pour le tapper jusqu'a le mache a balais casse, apprend a utiliser ton shell et tu verras que rsync accepte tous ces characteres dans les noms...
:rateau:
 
En général on ne fait pas un rsync par fichier pour information mais plus un lecteur complet vers un autre. ;)
Et ce n'est pas moi qui choisi les messages d'erreur de transfert uniquement pour les fichiers et dossiers qui sont dans les cas soulignés dans le topic de départ...
 
Premier jet sur le répertoire test
Bloc de code:
find * | while read FILENAME
do
   mv $FILENAME $(echo $FILENAME | awk '{ gsub(/ '\$'/, "");print}');
done
find * | while read FILENAME2
do
   mv $FILENAME2 $(echo $FILENAME2 | awk '{ gsub(/\.'\$'/, "");print}');
done