附加文件的脚本

时间:2013-05-05 23:03:25

标签: ruby

我正在尝试编写一个脚本来执行以下操作:

有两个目录A和B.在目录A中,有一些名为“today”和“today1”的文件。在目录B中,有三个文件称为“今天”,“今天1”和“其他文件”。

我想循环遍历目录A中的文件,并将目录B中具有相似名称的文件附加到目录A中的文件。

我编写了下面的方法来处理这个问题,但我不确定这是否正常,或者是否有更简单的方法来处理这种情况?

请注意我正在运行目录B中的脚本。

def append_data_to_daily_files
  directory = "B"
  Dir.entries('B').each do |file|
    fileName = file
    next if file == '.' or file == '..'
    File.open(File.join(directory, file), 'a') {|file|
      Dir.entries('.').each do |item|
        next if !(item.match(/fileName/))
        File.open(item, "r")
        file<<item
        item.close
      end
      #file.puts "hello"
      file.close
    }
  end
end

2 个答案:

答案 0 :(得分:2)

在我看来,你的append_data_to_daily_files()方法试图做太多事情 - 这使得很难推理。将逻辑分解为非常小的步骤,并为每个步骤编写一个简单的方法。这是沿着这条路走的一个开始。

require 'set'

def dir_entries(dir)
  Dir.chdir(dir) {
    return Dir.glob('*').to_set
  }
end

def append_file_content(target, source)
  File.open(target, 'a') { |fh|
    fh.write(IO.read(source))
  }
end

def append_common_files(target_dir, source_dir)
  ts = dir_entries(target_dir)
  ss = dir_entries(source_dir)
  common_files = ts.intersection(ss)

  common_files.each do |file_name|
    t = File.join(target_dir, file_name)
    s = File.join(source_dir, file_name)
    append_file_content(t, s)
  end
end

# Run script like this:
#   ruby my_script.rb A B    
append_common_files(*ARGV)

通过使用Set,您可以轻松找出常见文件。通过使用glob,您可以避免过滤掉点目录的麻烦。通过设计代码从命令行获取其目录名称(而不是对脚本中的名称进行硬编码),最终得到了一个可能可重复使用的工具。

答案 1 :(得分:0)

我的解决方案......

def append_old_logs_to_daily_files
                directory = "B"
                #For each file in the folder "B"
                Dir.entries('B').each do |file|
                    fileName = file
                    #skip dot directories
                    next if file == '.' or file == '..'
                    #Open each file 
                    File.open(File.join(directory, file), 'a') {|file|
                        #Get each log file from the current directory in turn
                        Dir.entries('.').each do |item|
                            next if item == '.' or item == '..'
                            #that matches the day we are looking for
                            next if !(item.match(fileName))
                            #Read the log file
                            logFilesToBeCopied = File.open(item, "r")
                            contents = logFilesToBeCopied.read

                            file<<contents
                    end
                    file.close
                }
            end
        end