8
votes

Comment gérer des noms de fichiers avec des espaces?

J'utilise Perl sous Windows (Perl actif). J'ai un programme Perl pour Glob the Files dans le dossier actuel et les concaténez tous à l'aide de la commande DOS Copy appelée à partir de l'intérieur à l'aide du système () ...

Lorsque j'exécute, cela donne une erreur DOS disant "Le système ne peut pas trouver le fichier spécifié. " Il est lié aux espaces dans les noms de fichiers que j'ai. P>

Ceci est le code Perl: - p>

@files = glob "*.mp3";
$outfile = 'final.mp3';
$firsttime = 1;
foreach (@files)
{

    if($firsttime == 1)
    {
       @args = ('copy' ,"/b ","$_","+","$outfile", "$outfile");
       system (@args);
       #system("copy /b '$_'+$outfile $outfile"); 
       $firsttime = 0;  
    }
    else
    {
       @args = ('copy' ,"/b ","$outfile","+","$_", "$outfile");
       system (@args);
       #system("copy /b $outfile+'$_' $outfile"); 
    }

}


3 commentaires

Pourquoi ne pas lire les fichiers et les imprimer tous dans un fichier de sortie?


@ROBERT: signification ouverte (), lire () et écrire () l'un après l'autre ..


Aucune idée pourquoi cette question n'a jamais reçu de uppote. +1 de moi. Courut dans le même problème (encore) ...: - / ... juste maintenant.


7 Réponses :


9
votes

Votre code n'ajoute aucune citation autour des noms de fichiers.

Essayez p>

"\"$outfile\""


0 commentaires

1
votes

sous Windows Vous pouvez normalement mettre des citations doubles autour des noms de fichiers (et / ou des chemins) permettant aux caractères spéciaux, c'est-à-dire des caractères spéciaux, c'est-à-dire des «noms de fichiers longs».

c: \ "mon chemin long \ Ceci est un fichier.mp3" p>

EDIT: P>

Est-ce que cela ne fonctionne pas? P>

system("copy /b \"$_\"+$outfile $outfile");


2 commentaires

@Viper_sb: Je sais, mais comment atteindre cet effet dans le script Perl est la question.


Ne va-t-il pas maintenant casser pour un fichier "nom" .mp3 ? essayez \ "\ q $ _ \ e \"



1
votes

Les problèmes peuvent survenir lorsque vous essayez d'accéder à la variable $ _ à l'intérieur d'un bloc intérieur. La manière la plus sûre, changement: xxx

à: xxx

puis effectuez les modifications nécessaires sur @args , et échappez aux doublesquotes pour les inclure dans la chaîne .. xxx


0 commentaires

11
votes

Arrêtez d'utiliser System () pour faire un appel pouvant être effectué avec une bibliothèque portable. Perl a un Fichier :: Copier module, utilisez-le à la place et vous n'avez pas à vous soucier des choses comme Cela plus vous obtenez beaucoup mieux portabilité du système d'exploitation.


1 commentaires

Merci pour cette approche différente en utilisant le fichier :: copie.




0
votes

$ FileName = ~ s / \ / \ /;

Quel que soit le nom de fichier, utilisez simplement SLASH pour les espaces de référence


0 commentaires

0
votes

La commande "RENAME" intégrée Déplace également les fichiers:

    rename $source, $destination;   # ...and move


0 commentaires