PERL + bash: gestion des espaces vides dans les noms de fichier

PERL + bash: gestion des espaces vides dans les noms de fichier - Codes et scripts - Linux et OS Alternatifs

Marsh Posté le 17-07-2005 à 17:51:29    

Bonjour à tous,
 
J'ai un blème avec la gestion de fichier contenant des espaces:
 
Je parcours un répertoires conteant des fichiers. Ces fichiers ont des esapces dans leur nom, genre "Fichier de test.jpg"
Je cherche à changer le nom du fichier avec un script perl. Le script marche presque.
Je recupère le nom du fichier donné en arguement (my $name = $ARGV[0])
J'ajoute un préfixe à $name, et je change les blanc par des tirets ( s/\s/_/g ou un truc comme ça).
Ce qui me donne un nouveau nom de fichier.
 
La où ça se corse, c'est pour renommer le fichier. Je fait un appel systeme:
systeme ("mv $old_name $new_name" )
 
Le problème est que la varable $old_name contient des espaces. Donc mv voit plusieurs fichiers au lieu d'un seul. J'ai essayé plusieurs trucs, mais rien n'a marché. Pourtant je suis sur que c'est tout con.
Pourriez-vous m'aider ?

Reply

Marsh Posté le 17-07-2005 à 17:51:29   

Reply

Marsh Posté le 17-07-2005 à 17:57:12    

fais mv "$old_name" "$new_name"

Reply

Marsh Posté le 17-07-2005 à 17:57:38    

Je ne sias pas comment il va te l'interpréter mais as-tu essayer de mettre systeme("mv "$old_name" $new_name" ) ?
 
[EDIT] grilled :whistle:


Message édité par sebchap le 17-07-2005 à 17:58:13
Reply

Marsh Posté le 17-07-2005 à 18:00:39    

je viens de verifier avec un script de ce type :

Code :
  1. #!/bin/sh
  2. a="toto to";
  3. af="toto_to";
  4. mv "$a" "$af"


et j'ai bien un fichier toto_to au final

Reply

Marsh Posté le 17-07-2005 à 18:04:30    

Merci les gars, j'essayerais tout ça demain et je vous tiens au courant. ;)

Reply

Marsh Posté le 17-07-2005 à 18:15:53    

jlighty a écrit :

je viens de verifier avec un script de ce type :

Code :
  1. #!/bin/sh
  2. a="toto to";
  3. af="toto_to";
  4. mv "$a" "$af"


et j'ai bien un fichier toto_to au final


Ouai, le probleme est de savoir si Perl va comprendreet bien interprété les "" :/

Reply

Marsh Posté le 17-07-2005 à 18:17:35    

il n'a cas tous faire en sh, avec sed pour remplacer les espaces par les underscores.

Reply

Marsh Posté le 17-07-2005 à 18:20:28    

C'est ce que j'aurai fait aussi.... puisque je capte rien au perl :lol:
D'ailleurs ca m'interesse pas mal de m'y mettre (à perl et/ou python d'ailleurs) :)

Reply

Marsh Posté le 18-07-2005 à 10:51:30    

Me revoila.
 
Je fais cette commande shell:
 
for fichier in *; do echo $fichier; done
 
Ca me liste bien mes fichiers avec espace.  : toto to.jpg
 
Je fais cette commande:
 
for fichier in *; do perl rename.pl $fichier; done
 
où rename.pl est bêtement la commande: print "$ARGV[0]\n";
 
Et là il ne m'imprime que le premier "mot" de mon nom de fichier. Il s'arrete dès le premier espace : toto
 
C'est bizarre ça...
 

Reply

Marsh Posté le 18-07-2005 à 10:53:14    

Idée: ARGV[0] est le premier arguments/mot. Faudrait-il que je  concatène tous les arguments contenu dans @ARGV ?
 
Je vais essayer ça. [:dao]

Reply

Marsh Posté le 18-07-2005 à 10:53:14   

Reply

Marsh Posté le 18-07-2005 à 10:54:42    

print "@ARGV\n";
 
=> ça marche !!!

Reply

Marsh Posté le 18-07-2005 à 11:10:02    

Enfin !
 
Ca a pris du temps...
 
 
#!/usr/bin/perl
 
use strict;
use warnings;
 
my $old_name = join(' ',@ARGV);
my $new_name = join('_',@ARGV);
system ("cp", $old_name, $new_name);
 
exit;
 
 
C'est tellement con quand on y repense... :pt1cable:

Reply

Marsh Posté le 18-07-2005 à 13:51:00    

et si tu utilisé le module perl File (http://search.cpan.org/~nwclark/perl-5.8.7/lib/File/Copy.pm), tu te ferai moins chié et tu n'utiliserai pas ces affreux appel à system pour  faire un truc aussi trivial :)


---------------
Two thousand years of misery, of torture in my name, hypocrisy made paramount, paranoia the law, my name is called religion, sadistic, sacred whore.
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed