This Ruby code selects file directories which are older than a certain date and outputs an XML file naming all the directories to be removed. It does this by reading a directory listing formatted within the XML file 'dir.xml', all directories are named by a date-stamp, which is used to determine if the directory should be removed.
This example is used to maintain the webcamera (named 'pear') which saves it's images to a date-stamped directory daily. Any directory which is older than 14 days will be marked for deletion.
def directory_housekeeping()
lifespan = 14
format_mask = 'm_d_y'
separator = format_mask.match(/[\_*\-]/).to_s
earliest_date = Time.now + (60 * 60 * 24) * -lifespan
cut_off_date = Date.new(y=earliest_date.year,m=earliest_date.month,d=earliest_date.day)
a_format = Array.new
a_format[0] = format_mask.match(/^[y,m,d]*/).to_s
a_format[1] = format_mask.match(separator + '[y,m,d]*').to_s.gsub(separator,'')
a_format[2] = format_mask.match('[y,m,d]$').to_s
file = File.new('../housekeeping/webcam_pear/dir.xml')
ddoc = REXML::Document.new(file)
file.close
file_delete = File.new('../housekeeping/webcam_pear/files2delete.xml', 'w')
doc_delete = Document.new()
doc_delete.add_element('files')
ddoc.root.elements.each('file') do |file_node|
sfile = file_node.text
idate = Array.new
idate[0] = sfile.match(/^\d*/).to_s.to_i
idate[1] = sfile.match(/\_\d*/).to_s.gsub(separator,'').to_i
idate[2] = sfile.match(/\_\d*\d$/).to_s.gsub(separator,'').to_i
h = Hash.new
0.upto(2) {|i| h[a_format[i]] = idate[i]}
file_date = Date.new(y=h['y'], m=h['m'], d=h['d'])
if file_date < cut_off_date
o_file2delete = Element.new('file')
o_file2delete.text = file_date.strftime(dformat)
doc_delete.root.add_element o_file2delete
end
end
file_delete.puts doc_delete
end
file: dir.xml
<dir>
<file>11_4_2007</file>
<file>11_5_2007</file>
<file>11_6_2007</file>
<file>11_7_2007</file>
<file>11_8_2007</file>
<file>11_9_2007</file>
<file>12_10_2007</file>
<file>12_11_2007</file>
<file>12_1_2007</file>
<file>12_12_2007</file>
<file>12_13_2007</file>
<file>12_14_2007</file>
<file>12_15_2007</file>
<file>12_16_2007</file>
<file>12_17_2007</file>
<file>12_18_2007</file>
<file>12_19_2007</file>
<file>12_20_2007</file>
<file>12_21_2007</file>
<file>12_2_2007</file>
<file>12_22_2007</file>
<file>12_23_2007</file>
<file>12_24_2007</file>
<file>12_25_2007</file>
<file>12_26_2007</file>
<file>12_27_2007</file>
<file>12_28_2007</file>
<file>12_3_2007</file>
<file>12_4_2007</file>
<file>12_5_2007</file>
<file>12_6_2007</file>
<file>12_7_2007</file>
<file>12_8_2007</file>
<file>12_9_2007</file>
</dir>
file: files2delete.xml
<files>
<file>11_4_2007</file>
<file>11_5_2007</file>
<file>11_6_2007</file>
<file>11_7_2007</file>
<file>11_8_2007</file>
<file>11_9_2007</file>
<file>12_10_2007</file>
<file>12_11_2007</file>
<file>12_1_2007</file>
<file>12_12_2007</file>
<file>12_13_2007</file>
<file>12_14_2007</file>
<file>12_15_2007</file>
<file>12_2_2007</file>
<file>12_3_2007</file>
<file>12_4_2007</file>
<file>12_5_2007</file>
<file>12_6_2007</file>
<file>12_7_2007</file>
<file>12_8_2007</file>
<file>12_9_2007</file>
</files>