2010-11-26 21 views
8

Uso Perl en Windows (Active Perl). Tengo un programa perl para englobar los archivos en la carpeta actual y concatenarlos todos usando el comando dos copy llamado desde adentro usando system() ...¿Cómo se manejan los nombres de archivos con espacios?

Cuando ejecuto, esto da un error dos diciendo "El sistema no puede encontrar el archivo especificado. " Está relacionado con los espacios en los nombres de archivo que tengo.

Este es el código 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"); 
    } 

} 

pegote devuelve una matriz de nombres de archivos en mi carpeta actual, esos nombres de archivo tienen espacios entre ellos, por lo que los elementos de la matriz tienen espacios en el medio. Cuando uso el sistema (...) para ejecutar mi comando de copia en esos elementos de la matriz usando "$ _" como se muestra arriba, da error como el anterior.

Intenté dos maneras en que podía llamar al sistema (...) pero sin éxito.

Me gustaría saber,

1] ¿Cómo puedo conseguir este trabajo en archivos que tienen espacios entre ellos utilizando el código de seguridad. Cómo 'escapar' el espacio en blanco en los nombres de archivo.

2] Cualquier solución alternativa en Perl para lograr lo mismo. (Los más simples son bienvenidos ..)

+0

¿Por qué no acaba de leer los archivos e imprimir todos ellos a un archivo de salida? – robert

+0

@robert: Significado abrir(), leer() y escribir() uno tras otro .. – goldenmean

+0

No tengo idea de por qué esa pregunta nunca recibió un voto popular. +1 de mi parte Se encontró con el mismo problema (nuevamente) ...: -/... justo ahora. – 0xC0000022L

Respuesta

9

Su código no agrega ninguna comilla alrededor de los nombres de los archivos.

Trate

"\"$_\"" 

y

"\"$outfile\"" 
+0

@Ed - Gracias. Solución rápida, precisa y efectiva. Love perl .. – goldenmean

1

Pueden surgir problemas cuando se está tratando de acceder a la variable $_ dentro de un bloque interno. La más segura, cambie:

foreach (@files) 

a:

foreach $file (@files) 

Después, realice los cambios necesarios en @args, y escapar comillas dobles para incluirlos en la cadena ..

@args = ('copy' ,"/b ","\"$file\"","+","$outfile", "$outfile"); 
... 
@args = ('copy' ,"/b ","$outfile","+","\"$file\"", "$outfile"); 
1

En las ventanas normalmente puede poner comillas dobles alrededor de los nombres de los archivos (y/o rutas) permitiendo caracteres especiales, es decir, "nombres largos de archivos".

C: \ "mi larga ruta \ esto es un file.mp3"

Editar:

qué no funciona?

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

(NOTA DE LAS comillas dobles dentro de la cadena de cotizaciones individuales) no

+0

@Viper_Sb: Lo sé, pero cómo lograr ese efecto en el script de Perl es la pregunta. – goldenmean

+0

@goldenmean editó mi respuesta –

+0

@Viper_sb: gracias, sí, ese es el camino. trabajos. – goldenmean

11

deja de usar system() para hacer una llamada que se puede hacer con una biblioteca portátil. Perl tiene un módulo File::Copy, utilícelo en su lugar y no tiene que preocuparse por cosas como esta además de que obtiene una mejor portabilidad del sistema operativo.

+2

y una mejor detección/manejo de errores – ysth

+0

Gracias por este enfoque diferente usando File :: Copy. – goldenmean

7

system rara vez es la respuesta correcta, use File::Copy ;

para concatenar todos los archivos:

use File::Copy; 
my @in = glob "*.mp3"; 
my $out = "final.mp3"; 

open my $outh, ">", $out; 
for my $file (@in) { 
    next if $file eq $out; 
    copy($file, $outh); 
} 
close $outh; 
+0

@ Gravity: gracias por el código cortado que muestra el uso de File :: Copy. – goldenmean

0

$ archivo = ~ s/\/\ /;

lo que cada vez el nombre del archivo que se acaba de usar barra de espacios refrence

Cuestiones relacionadas