我正在尝试编写一个脚本来执行以下操作:
有两个目录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
答案 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