Comment gérer les noms de fichiers avec des espaces?
- Je utiliser Perl sur windows(Active Perl). J'ai un programme en perl pour glob les fichiers dans le dossier courant, et de les enchaîner tous dos à l'aide de la commande copier appelée à partir de l'intérieur à l'aide de system()...
Quand je l'execute, ce qui donne un dos d'erreur disant: "Le système ne peut pas trouver le fichier spécifié." C'est lié à la les espaces dans les noms de fichiers que j'ai.
C'est le code perl :-
@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");
}
}
glob retourne un tableau de noms de fichiers dans mon dossier en cours, Ces noms de fichier des espaces entre eux, de sorte que les éléments du tableau ont des espaces entre les deux. Lorsque j'utilise le système(...) pour exécuter ma commande de copie sur les éléments du tableau à l'aide de "$_" comme indiqué ci-dessus, il donne une erreur comme ci-dessus.
J'ai essayé quelques façons dont je pourrais appeler le système(...) mais sans succès.
Je voudrais savoir,
1] Comment puis-je obtenir ce travail sur les fichiers qui ont des espaces entre eux à l'aide du code ci-dessus. Comment faire pour "échapper" à l'espace dans les noms de fichier.
2] Aucune solution de remplacement en Perl pour réaliser la même chose. (La plus Simple de bienvenue..)
Sens open(), read() et write (), l'un après l'autre..
Aucune idée de pourquoi cette question n'a jamais reçu un upvote. +1 de moi. A couru dans le même problème (encore une fois) ... :-/ ... juste maintenant.
OriginalL'auteur goldenmean | 2010-11-26
Vous devez vous connecter pour publier un commentaire.
Votre code ne pas ajouter des guillemets autour des noms de fichiers.
Essayer
et
OriginalL'auteur Ed Guiness
Cesser d'utiliser
system()
de faire un appel peut être fait avec une bibliothèque portable. Perl a un la File::Copy module, utiliser à la place et vous n'avez pas à vous soucier de ce genre de choses, plus vous obtenez beaucoup de meilleurs OS de la portabilité.Merci pour cette approche différente à l'aide de File::Copy.
OriginalL'auteur Ian C.
system
est rarement la bonne réponse,use File::Copy;
Pour concaténer tous les fichiers:
OriginalL'auteur grawity
Problèmes peuvent survenir lorsque vous essayez d'accéder à la variable
$_
à l'intérieur d'un bloc interne. Le moyen le plus sûr, le changement::
Puis faire les modifications nécessaires sur
@args
, et d'échapper à la doublequotes de les inclure dans la chaîne..OriginalL'auteur Ruel
Dans windows, vous pouvez normalement placer des guillemets autour des noms de fichier (et/ou des chemins d'accès) permettant de caractères spéciaux-je.e "noms de fichier longs".
C:\"mon long chemin\c'est un fichier.mp3"
Edit:
N'est-ce pas le travail?
(NOTEZ LES guillemets à l'intérieur de la chaîne sans guillemets simples)
édité ma réponse
Oui c'est le chemin. des œuvres.
N'est-ce pas maintenant une pause pour
a file "name".mp3
? essayez\"\Q$_\E\"
OriginalL'auteur Viper_Sb
$filename =~ s/\ /\ /;
ce que jamais le nom du fichier est simplement utiliser la barre oblique à la refrence espaces
OriginalL'auteur user3784340