RUBY-如果文件不存在,如何将文件复制到特定目录

RUBY-如果文件不存在,如何将文件复制到特定目录,ruby,file,scripting,copy,Ruby,File,Scripting,Copy,我认为这是一个非常简单的问题,但我被卡住了 我正在尝试编写一个脚本来查找第一个目录,然后检查第二个目录以查看是否有匹配的文件。如果文件匹配,我需要将文件从第二个目录复制到第三个目录,前提是它们在第三个目录中不存在 这是我到目前为止所拥有的东西的副本。代码仍然覆盖第三个目录中的文件,即使它们已经存在。我做错了什么 谢谢 #!/usr/bin/ruby require 'FileUtils' library_path_1 = ARGV[0] library_path_2 = ARGV[1] li

我认为这是一个非常简单的问题,但我被卡住了

我正在尝试编写一个脚本来查找第一个目录,然后检查第二个目录以查看是否有匹配的文件。如果文件匹配,我需要将文件从第二个目录复制到第三个目录,前提是它们在第三个目录中不存在

这是我到目前为止所拥有的东西的副本。代码仍然覆盖第三个目录中的文件,即使它们已经存在。我做错了什么

谢谢

#!/usr/bin/ruby

require 'FileUtils'

library_path_1 = ARGV[0]
library_path_2 = ARGV[1]
library_path_3 = ARGV[2]

dir_1 = Dir.glob(library_path_1 + "/**/*").select{ |x| File.file? x }
dir_2 = Dir.glob(library_path_2 + "/**/*").select{ |x| File.file? x }
destination = Dir.glob(library_path_3 + "/**/*").select{ |x| File.file? x }

dir_1.each do |filename|
  dir_2.each do |path|
    destination.each do |existing_file|

      existing_file = File.basename(existing_file)

      if path.include?(File.basename(filename))
        FileUtils.cp(path, library_path_3) unless File.exists?(existing_file)
      end

    end
  end
end

似乎您只是通过文件名验证文件,但您必须通过全名检查文件,如下所示:

existing_file = File.basename(existing_file)

if path.include?(File.basename(filename))
   FileUtils.cp(path, library_path_3) unless File.exist?(File.join(library_path_3, existing_file))
end

以下是根据@Cary Swoveland的答案编写的最终脚本。谢谢大家

require 'FileUtils'

library_path_1 = ARGV[0]
library_path_2 = ARGV[1]
library_path_3 = ARGV[2]

# check the managed media folder for files, look in original capture scratch for all files in managed media.
# if files in managed media exist in original capture scratch, copy them to the destination folder.

managed_media_folder = Dir.glob(library_path_1 + "/**/*").select{ |x| File.file? x }
original_capture_scratch = Dir.glob(library_path_2 + "/**/*").select{ |x| File.file? x }
destination = Dir.glob(library_path_3 + "/**/*").select{ |x| File.file? x }

bn = managed_media_folder.map { |fn| File.basename fn } - destination.map { |fn| File.basename fn }
original_capture_scratch.each do |fn| 
  if bn.include? File.basename(fn)
    puts fn
    FileUtils.cp(fn, library_path_3) 
  end
end

谢谢全名是指我需要检查文件的完整路径吗?File.join在这里做什么?@MaileThiesen它在文件之前附加第三个文件夹路径name@MaileThiesen
glob
返回相对于库路径的文件名(路径)。调用
File.exist?
而不预先指定该路径(这就是
join
所做的),检查该文件是否存在于当前目录中。@Stefan是的,在当前目录中,但您说它在任何情况下都会重写一个文件,如果它也存在于第三个文件夹中@МаъСъъъъ“您说它在任何情况下都会重写一个文件”是吗?对不起,我不理解您的评论:-)顺便说一句,
File.exists?
已被弃用,您应该使用
File.exist?
谢谢,Stephan!我改了。除了目标目录中的覆盖问题外,它似乎正在工作。这成功了!当我在目录名中添加'destination.map'和下划线时。非常感谢你!谢谢你的帮助,梅勒。
dir_1.each do |file|
  filename = File.basename(file)
  if exists_in_dir2?(filename) && exists_in_dir3?(filename) == false
    copy_to_destination(filename) 
  end
end

def copy_to_destination(filename)
    File.copy(filename, "#{library_path_3}/{filename}")
end

def exists_in_dir2?(filename)
    dir_2.each do |path|
        path.include?("#{filename}")
    end
end

def exists_in_dir3?(filename)
    destination.each do |existing_file|
        File.exist?("#{filename}")
    end
end
require 'FileUtils'

library_path_1 = ARGV[0]
library_path_2 = ARGV[1]
library_path_3 = ARGV[2]

# check the managed media folder for files, look in original capture scratch for all files in managed media.
# if files in managed media exist in original capture scratch, copy them to the destination folder.

managed_media_folder = Dir.glob(library_path_1 + "/**/*").select{ |x| File.file? x }
original_capture_scratch = Dir.glob(library_path_2 + "/**/*").select{ |x| File.file? x }
destination = Dir.glob(library_path_3 + "/**/*").select{ |x| File.file? x }

bn = managed_media_folder.map { |fn| File.basename fn } - destination.map { |fn| File.basename fn }
original_capture_scratch.each do |fn| 
  if bn.include? File.basename(fn)
    puts fn
    FileUtils.cp(fn, library_path_3) 
  end
end