¿Cómo muevo un archivo con Ruby?

173

Quiero mover un archivo con Ruby. ¿Cómo puedo hacer eso?

Željko Filipin
fuente

Respuestas:

264

Puede usar FileUtils para hacer esto.

#!/usr/bin/env ruby

require 'fileutils'

FileUtils.mv('/tmp/your_file', '/opt/new/location/your_file')

Recuerda; Si se está moviendo a través de particiones, "mv" copiará el archivo a un nuevo destino y desvinculará la ruta de origen.

Berk D. Demir
fuente
Olvidé agregar que no se puede mover a través de particiones. Gracias.
Željko Filipin
66
En realidad mv hace la copia por ti. "Mueve src de archivo (s) a dest. Si el archivo y dest existen en la partición de disco diferente, el archivo se copia en su lugar". ... ruby-doc.org/core/classes/FileUtils.html#M004330
Darkerstar
¿Puedes confirmar si el archivo se elimina después de ser copiado de una partición diferente?
knoopx
89

Una vieja pregunta, me sorprende que nadie haya respondido a esta solución simple. No necesita fileutils o una llamada al sistema, simplemente cambie el nombre del archivo a la nueva ubicación.

File.rename source_path, target_path

Codificación feliz

Peter
fuente
11
El cambio de nombre del archivo no funcionará en las particiones y arroja el error "Enlace de dispositivo cruzado no válido". FileUtils es una mejor opción en esos casos, pero para un simple movimiento en la misma partición, cambiar el nombre funciona.
d3vkit
@ d3vkit, gracias por el comentario, pero en Windows esto funciona en unidades, locales y remotas, por ejemplo, <code> File.rename 'c: /test/test.txt', 'e: /test.txt' </code>, que sistema operativo usas
Peter
1
Ah, tuve problemas específicamente en Ubuntu usando algunos recursos compartidos en red de Windows. También terminé teniendo problemas con FileUtils.mv, que movería el archivo y luego diría que no tenía permiso para eliminar el archivo anterior. Terminé usando FileUtils.cp y luego File.delete para deshacerme del viejo archivo.
d3vkit
3
Esto definitivamente no funciona a través de la partición en Linux. Supongo que depende de las API del sistema operativo subyacente. Para estar seguro, solo use FileUtils.mv.
akostadinov
1
Tenga en cuenta que en algunos casos es posible que desee restringir a la misma partición, como lo estoy haciendo ahora para garantizar una operación atómica.
Zorg
16

FileUtils.move

require "FileUtils"
FileUtils.move 'stuff.rb', '/notexist/lib/ruby'
Željko Filipin
fuente
3
+1 Tenga en cuenta que .move es un alias de .mv, por lo que también debería poder hacer FileUtils.mv.
Tim Knight
1
Gracias, me gusta .move más que .mv. :)
Željko Filipin
1
Yo no. mvme hace sentir como si estuviera en mi amada consola;)
Erik Escobedo
77
Y lo bueno de Rubí es que tiene tanto movey mvlo que uno puede elegir cualquiera de ellos. :)
Željko Filipin
1
En caso de ser require "fileutils"(sin tapas)
Clint Pachl
1

Aquí hay una plantilla.

 src_dir = "/full_path/to_some/ex_file.txt"

 dst_dir = "/full_path/target_dir"

 #Use the method below to do the moving
 move_src_to_target_dir(src_dir, dst_dir)



 def archive_src_to_dst_dir(src_dir, dst_dir)

     if File.exist ? (src_dir)

     puts "about to move this file:  #{src_dir}"

     FileUtils.mv(src_dir, dst_dir)
 else

     puts "can not find source file to move"

 end
 end
zee
fuente
-8

puedes mover tu archivo así

Rails.root.join ('foo', 'bar')

kajal
fuente
1
Esa es la respuesta a la pregunta "¿Cómo construyo una ruta / nombre de archivo relativo al directorio raíz de un proyecto Rails?". No mueve nada.
Andreas Baumgart