Как мне переместить файл с помощью Ruby?

173

Я хочу переместить файл с помощью Ruby. Как я могу это сделать?

Желько Филипин
источник

Ответы:

264

Вы можете использовать FileUtils для этого.

#!/usr/bin/env ruby

require 'fileutils'

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

Помните; если вы перемещаетесь по разделам, «mv» скопирует файл в новое место назначения и отменит связь с исходным путем.

Берк Д. Демир
источник
Я забыл добавить, что вы не можете перемещаться между разделами. Спасибо.
Желько Филиппин
6
На самом деле М.В. делает копию для вас. «Перемещает файл (ы) src в dest. Если файл и dest существуют в другом разделе диска, файл копируется вместо этого». ... ruby-doc.org/core/classes/FileUtils.html#M004330
Darkerstar
Вы можете подтвердить удаление файла после копирования из другого раздела?
knoopx
89

Старый вопрос, я удивлен, что никто не ответил на это простое решение. Вам не нужны fileutils или системный вызов, просто переименуйте файл в новое место.

File.rename source_path, target_path

Удачного кодирования

Питер
источник
11
Переименование файла не будет работать между разделами, и выдает ошибку «Неверная ссылка между устройствами». FileUtils - лучший выбор в этих случаях, но для простого перемещения в том же разделе переименование работает.
d3vkit
@ d3vkit, спасибо за замечание, но в Windows это работает на дисках, локальных и удаленных, например, <code> File.rename 'c: /test/test.txt', 'e: /test.txt' </ code>, какую ОС вы используете?
Питер
1
Ах, у меня были проблемы именно в Ubuntu с использованием некоторых сетевых ресурсов Windows. У меня также возникли проблемы с FileUtils.mv, который переместил файл и сказал, что у него нет разрешения на удаление старого файла. В итоге я использовал FileUtils.cp, а затем File.delete, чтобы избавиться от старого файла.
d3vkit
3
Это определенно не работает через раздел на Linux. Я полагаю, это зависит от API-интерфейсов ОС. Чтобы быть уверенным, просто используйте FileUtils.mv.
Акостадинов
1
Обратите внимание, что в некоторых случаях вы можете захотеть ограничиться одним и тем же разделом, как я сейчас делаю, чтобы обеспечить атомарную операцию.
Зорг
16

FileUtils.move

require "FileUtils"
FileUtils.move 'stuff.rb', '/notexist/lib/ruby'
Желько Филипин
источник
3
+1 Обратите внимание, что .move - это псевдоним .mv, так что вы также можете использовать FileUtils.mv.
Тим Найт
1
Спасибо, мне просто нравится больше .mv. :)
Желько Филиппин
1
Я не. mvзаставляет меня чувствовать, что я в своей любимой консоли;)
Эрик Эскобедо
7
И хорошая вещь о Руби является то , что она имеет как moveи mvпоэтому можно выбрать любой из них. :)
Желько Филипин
1
Должно быть require "fileutils"(без шапки)
Клинт Пахл
1

вот шаблон.

 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
зет
источник
-8

Вы можете переместить свой файл, как это

Rails.root.join ( 'Foo', 'бар')

Kajal
источник
1
Это ответ на вопрос «Как построить путь / имя файла относительно корневого каталога проекта Rails?». Это ничего не трогает.
Андреас Баумгарт