1

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

有两个目录 A 和 B。在目录 A 中,有名为“today”和“today1”的文件。在目录 B 中,有三个文件,分别称为“today”、“today1”和“otherfile”。

我想遍历目录 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
4

2 回答 2

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,您可以避免过滤掉点目录的麻烦。通过将代码设计为从命令行获取其目录名称(而不是在脚本中硬编码名称),您最终得到了一个可能可重用的工具。

于 2013-05-05T23:50:11.977 回答
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
于 2013-05-06T10:25:28.353 回答