Làm cách nào để di chuyển tệp với Ruby?


173

Tôi muốn di chuyển một tập tin với Ruby. Làm thế nào để làm điều đó?

Câu trả lời:


264

Bạn có thể sử dụng FileUtils để làm điều này.

#!/usr/bin/env ruby

require 'fileutils'

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

Nhớ lại; nếu bạn đang di chuyển qua các phân vùng, "mv" sẽ sao chép tệp vào đích mới và hủy liên kết đường dẫn nguồn.


Tôi quên thêm rằng bạn không thể di chuyển qua các phân vùng. Cảm ơn.
Željko Filipin

6
Trên thực tế mv không sao chép cho bạn. "Di chuyển (các) tệp src sang Dest. Nếu tệp và mệnh tồn tại trên phân vùng đĩa khác nhau, thay vào đó tệp sẽ được sao chép." ... ruby-doc.org/core/groupes/FileUtils.html#M004330
Darkerstar

bạn có thể xác nhận nếu tập tin bị xóa sau khi được sao chép từ một phân vùng khác không?
knoopx

89

Một câu hỏi cũ, tôi ngạc nhiên không ai trả lời giải pháp đơn giản này. Bạn không cần fileutils hoặc systemcall, chỉ cần đổi tên tệp thành vị trí mới.

File.rename source_path, target_path

Chúc mừng mã hóa


11
Đổi tên tệp sẽ không hoạt động trên các phân vùng và đưa ra lỗi "Liên kết thiết bị chéo không hợp lệ". FileUtils là một lựa chọn tốt hơn trong những trường hợp đó, nhưng đối với một động tác đơn giản trong cùng một phân vùng, đổi tên hoạt động.
d3vkit

@ d3vkit, cảm ơn vor nhận xét nhưng trong windows này hoạt động trên các ổ đĩa, cục bộ và từ xa, ví dụ: <code> File.rename 'c: /test/test.txt', 'e: /test.txt' </ code>, bạn dùng hệ điều hành nào
peter

1
Ah, tôi đã gặp sự cố cụ thể trong Ubuntu khi sử dụng một số chia sẻ được nối mạng Windows. Cuối cùng tôi cũng gặp sự cố với FileUtils.mv, nó sẽ di chuyển tệp và sau đó nói rằng nó không được phép xóa tệp cũ. Tôi đã kết thúc bằng FileUtils.cp và sau đó File.delete để thoát khỏi tệp cũ.
d3vkit

3
Điều này chắc chắn không hoạt động trên phân vùng trên linux. Tôi đoán nó phụ thuộc vào các API hệ điều hành cơ bản. Để chắc chắn, chỉ cần sử dụng FileUtils.mv.
akostadinov

1
Lưu ý trong một số trường hợp bạn có thể muốn giới hạn trong cùng một phân vùng, vì tôi đang làm ngay bây giờ để đảm bảo hoạt động nguyên tử.
Zorg

16

FileUtils.move

require "FileUtils"
FileUtils.move 'stuff.rb', '/notexist/lib/ruby'

3
+1 Lưu ý rằng .move là bí danh của .mv, do đó bạn cũng có thể thực hiện FileUtils.mv.
Tim Knight

1
Cảm ơn, tôi chỉ thích .move thêm mà .mv. :)
eljko Filipin

1
Tôi không. mvlàm cho tôi cảm thấy như mình đang ở trong bảng điều khiển yêu quý của mình;)
Erik Escobedo

7
Và điều tuyệt vời ở Ruby là nó có cả hai movemvvì vậy người ta có thể chọn một trong hai. :)
Željko Filipin

1
Nên require "fileutils"(không giới hạn)
Clint Pachl


1

đây là một mẫu

 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

bạn có thể di chuyển tập tin của bạn như thế này

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


1
Đó là câu trả lời cho câu hỏi "Làm cách nào để tạo đường dẫn / tên tệp liên quan đến thư mục gốc của dự án Rails?". Nó không di chuyển bất cứ thứ gì.
Andreas Baum hành
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.