Página 1 de 1

Cambiar nombre de archivo

NotaPublicado: 2017-05-15 14:29 @645
por enric73
Buenas.

Dispongo de un archivo con nombre wrfpost_d01_2017-05-15_00:00:00.grb y necesito dejarlo como wrfpost_d01_2017-05-15_00.grb, es decir, eliminar :00:00.

¿Cómo puedo hacerlo? chop y substract no me sirven; si fueran los primeros o últimos caracteres, sí.

Re: Cambiar nombre de archivo

NotaPublicado: 2017-05-15 15:51 @702
por explorer
Se me ocurren dos formas.

La primera es usando una expresión regular:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $nombre_archivo = 'wrfpost_d01_2017-05-15_00:00:00.grb';
  2. $nombre_archivo =~ s/:00:00//;                          # buscar el patrón, y quitarlo
  3. say $nombre_archivo;
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
Esto se puede hacer así porque solo existe un lugar dentro del nombre del archivo que coincide con el patrón ':00:00'.

Otra forma es "quitando" los caracteres de una determinada posición:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $nombre_archivo = 'wrfpost_d01_2017-05-15_00:00:00.grb';
  2. substr($nombre_archivo, -10, 6) = "";                   # Los 6 caracteres que hay a partir de la posición -10, los sustituimos por ""
  3. say $nombre_archivo;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
(y... como puedes ver, sí que se podía usar substr() ;) )

Re: Cambiar nombre de archivo

NotaPublicado: 2017-05-31 11:17 @511
por enric73
Muchas gracias, explorer.

¿Cómo lo hacías para que el cambio de nombre también quede modificado realmente? La modificación aparece en pantalla pero en el directorio, el fichero mantiene el mismo nombre.

¿Lo harías así?
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. (my $newName = $grib) =~ s/:00:00//;
  2. rename $grib, $newName;
  3. (my $newName2 = $grib) =~ s/:00:00.grb//;
  4. rename $grib, $newName2;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Realmente necesito renombrarlo de dos maneras.

En el caso de utilizar sustr($nombre_archivo, -10, 6) = ""; ¿Sería así?
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. (my $newName = $grib) =~ sustr($grib, -10, 6) = "";
  2. rename $grib, $newName;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Gracias.

Re: Cambiar nombre de archivo

NotaPublicado: 2017-06-02 15:50 @701
por explorer
enric73 escribiste:¿Cómo lo hacías para que el cambio de nombre también quede modificado realmente? La modificación aparece en pantalla pero en el directorio, el fichero mantiene el mismo nombre.

Bueno, guardaría el nombre original en la variable $original, modificaría el nombre en $nuevo, y finalmente hago un rename

enric73 escribiste:¿Lo harías así?
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. (my $newName = $grib) =~ s/:00:00//;
  2. rename $grib, $newName;
  3. (my $newName2 = $grib) =~ s/:00:00.grb//;
  4. rename $grib, $newName2;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
No puedes renombrar el mismo archivo dos veces. El segundo rename() sacará un mensaje de error diciendo que el archivo $grib ya no existe (fue renombrado un par de líneas antes).

enric73 escribiste:Realmente necesito renombrarlo de dos maneras.

En el caso de utilizar sustr($nombre_archivo, -10, 6) = ""; ¿Sería así?
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. (my $newName = $grib) =~ substr($grib, -10, 6) = "";
  2. rename $grib, $newName;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
No sé qué significa eso de renombrarlo dos veces. ¿Quieres decir que hay que hacer dos modificaciones en el nombre del archivo antes de hacer el cambio de nombre del archivo en el disco?

Quizás con un ejemplo completo lo tendríamos más claro. Solicitaste una eliminación de unos caracteres, y eso es lo que hace el substr(). Ahora bien, aquí hay que saber jugar al ajedrez. Si necesitas el nombre original para poder hacer un rename(), guárdalo antes en otra variable. Sabiendo que el proceso substr() es destructivo, mantén una copia, y así luego ya puedes hacer el rename() con los nombres anterior y nuevo.