Comment déplacer un fichier avec Ruby?

173

Je souhaite déplacer un fichier avec Ruby. Comment je fais ça?

Željko Filipin
la source

Réponses:

264

Vous pouvez utiliser FileUtils pour ce faire.

#!/usr/bin/env ruby

require 'fileutils'

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

Rappelles toi; si vous vous déplacez à travers les partitions, "mv" copiera le fichier vers la nouvelle destination et dissociera le chemin source.

Berk D. Demir
la source
J'ai oublié d'ajouter que vous ne pouvez pas vous déplacer entre les partitions. Merci.
Željko Filipin
6
En fait, mv fait la copie pour vous. "Déplace le (s) fichier (s) src vers dest. Si le fichier et la destination existent sur la partition de disque différente, le fichier est copié à la place." ... ruby-doc.org/core/classes/FileUtils.html#M004330
Darkerstar
pouvez-vous confirmer si le fichier est supprimé après avoir été copié à partir d'une autre partition?
knoopx
89

Une vieille question, je suis surpris que personne n'ait répondu à cette solution simple. Vous n'avez pas besoin de fileutils ou d'un appel système, renommez simplement le fichier au nouvel emplacement.

File.rename source_path, target_path

Bon codage

peter
la source
11
Le changement de nom de fichier ne fonctionnera pas sur les partitions et génère l'erreur «Lien inter-périphérique non valide». FileUtils est un meilleur choix dans ces cas, mais pour un simple déplacement dans la même partition, le changement de nom fonctionne.
d3vkit
@ d3vkit, merci pour la remarque, mais dans Windows cela fonctionne sur les lecteurs, locaux et distants, par exemple <code> File.rename 'c: /test/test.txt', 'e: /test.txt' </code>, quel OS utilisez-vous?
peter
1
Ah, j'ai eu des problèmes spécifiquement dans Ubuntu en utilisant certains partages en réseau Windows. J'ai également eu des problèmes avec FileUtils.mv, qui déplaçait le fichier et disait ensuite qu'il n'avait pas l'autorisation de supprimer l'ancien fichier. J'ai fini par utiliser FileUtils.cp puis File.delete pour me débarrasser de l'ancien fichier.
d3vkit
3
Cela ne fonctionne certainement pas entre les partitions sous Linux. Je suppose que cela dépend des API du système d'exploitation sous-jacentes. Pour être sûr, utilisez simplement FileUtils.mv.
akostadinov
1
Notez que dans certains cas, vous voudrez peut - être vous limiter à la même partition, comme je le fais en ce moment pour assurer une opération atomique.
Zorg
16

FileUtils.move

require "FileUtils"
FileUtils.move 'stuff.rb', '/notexist/lib/ruby'
Željko Filipin
la source
3
+1 Notez que .move est un alias de .mv donc vous devriez être capable de faire FileUtils.mv aussi.
Tim Knight
1
Merci, j'aime juste .move plus que .mv. :)
Željko Filipin
1
Je ne. mvme donne l'impression d'être dans ma console bien-aimée;)
Erik Escobedo
7
Et ce qui est bien avec Ruby, c'est qu'il a les deux moveet mvque l'on peut donc choisir l'un ou l'autre. :)
Željko Filipin
1
Devrait être require "fileutils"(sans majuscules)
Clint Pachl
1

voici un modèle.

 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
la source
-8

vous pouvez déplacer votre fichier comme ceci

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

Kajal
la source
1
C'est la réponse à la question "Comment créer un chemin / nom de fichier relatif au répertoire racine d'un projet Rails?". Cela ne bouge rien.
Andreas Baumgart