Pulling elements into a method

I am new to ruby and I'm having trouble with a script I'm working on.
It probably is something simple that I am missing. I am working on a
script to delete some files from several directories.

Here is the part of the script I'm having problems with:

time = Time.now #set time object to the current time
month = time.month #grab the number of the month from the
current
day = time.day #grab the day of the current time
year = time.year #grab the year of the current time

day = day - 14
def delete_old_files(dir, time)
Dir.chdir(dir) do
Dir.foreach(".") do |entry|
next if File.stat(entry).directory? #prevent from deleting
directories

#Use the modification time
if File.mtime(entry) < time
  File.unlink(entry)
end
end
end
end

cleanup_dirs = ["E:/oracle/MB4/oraarch/", "E:/oracle/MB3/oraarch/",
"E:/oracle/MB5/oraarch", "F:/oracle/MBA/oraarch/", "F:/oracle/MB2/
oraarch/", "F:/oracle/MB3/oraarch/", "F:/oracle/MB/oraarch/"]
cleanup_dirs.each do |cleanup_directory|

delete_old_files(cleanup_directory,Time.local(year,month,day,00,00,0))

end

I should probably use a block or proc or something like that. Any
advice is greatly appreciated. I'm getting the argument out of range
error.

Thanks.

At a shell prompt on a proper operating system you can do something like this:

find your_dir -type f -mtime +14 -print0 | xargs -r0 rm

If you want to do it in Ruby you can do

require 'find'

limit = Time.now - 60*60*24*14

cleanup_dirs.each do |dir|
   Find.find dir do |f|
     File.unlink f if File.file? f &&
       File.mtime(f) < limit
   end
end

Cheers

  robert

···

On 06.02.2008 23:16, grooveska wrote:

I am new to ruby and I'm having trouble with a script I'm working on.
It probably is something simple that I am missing. I am working on a
script to delete some files from several directories.

Here is the part of the script I'm having problems with:

time = Time.now #set time object to the current time
month = time.month #grab the number of the month from the
current
day = time.day #grab the day of the current time
year = time.year #grab the year of the current time

day = day - 14
def delete_old_files(dir, time)
Dir.chdir(dir) do
Dir.foreach(".") do |entry|
next if File.stat(entry).directory? #prevent from deleting
directories

#Use the modification time
if File.mtime(entry) < time
  File.unlink(entry)
end

cleanup_dirs = ["E:/oracle/MB4/oraarch/", "E:/oracle/MB3/oraarch/",
"E:/oracle/MB5/oraarch", "F:/oracle/MBA/oraarch/", "F:/oracle/MB2/
oraarch/", "F:/oracle/MB3/oraarch/", "F:/oracle/MB/oraarch/"]
cleanup_dirs.each do |cleanup_directory|

delete_old_files(cleanup_directory,Time.local(year,month,day,00,00,0))

end

I should probably use a block or proc or something like that. Any
advice is greatly appreciated. I'm getting the argument out of range
error.

grooveska wrote:

I'm getting the argument out of range
error.

Thanks.

Post the exact error message, and also post which line in your code that
the error message refers to.

···

--
Posted via http://www.ruby-forum.com/\.

grooveska wrote:

Here is the part of the script I'm having problems with:

time = Time.now #set time object to the current time
month = time.month #grab the number of the month from the
current
day = time.day #grab the day of the current time
year = time.year #grab the year of the current time

day = day - 14
def delete_old_files(dir, time)
Dir.chdir(dir) do
Dir.foreach(".") do |entry|
next if File.stat(entry).directory? #prevent from deleting
directories

#Use the modification time
if File.mtime(entry) < time
  File.unlink(entry)
end
end
end
end

cleanup_dirs = ["E:/oracle/MB4/oraarch/", "E:/oracle/MB3/oraarch/",
"E:/oracle/MB5/oraarch", "F:/oracle/MBA/oraarch/", "F:/oracle/MB2/
oraarch/", "F:/oracle/MB3/oraarch/", "F:/oracle/MB/oraarch/"]
cleanup_dirs.each do |cleanup_directory|

delete_old_files(cleanup_directory,Time.local(year,month,day,00,00,0))

end

I should probably use a block or proc or something like that. Any
advice is greatly appreciated. I'm getting the argument out of range
error.

Thanks.

Pay attention to this code:

day = day - 14
...
...
Time.local(year,month,day,00,00,0)

···

--
Posted via http://www.ruby-forum.com/\.

Well, for one thing, your day will be negative if it is less than 14.
I would think you'd be better off using Date instead of Time. To
illustrate (for today)...

irb:(main):001:0> require 'date'
=> true
irb:(main):002:0> d = Date.today
=> #<Date: 4908977/2,0,2299161>
irb:(main):003:0> d.day - 14
=> -8
irb:(main):004:0> d.to_s
=> "2008-02-06"
irb:(main):005:0> (d - 14).to_s
=> "2008-01-23"
irb:(main):006:0> Time.local(2008, 2, -8)
Argument Error: argument out of range...

hth,
Todd

···

On Feb 6, 2008 4:19 PM, grooveska <ryangs@mac.com> wrote:

I am new to ruby and I'm having trouble with a script I'm working on.
It probably is something simple that I am missing. I am working on a
script to delete some files from several directories.

Here is the part of the script I'm having problems with:

time = Time.now #set time object to the current time
month = time.month #grab the number of the month from the
current
day = time.day #grab the day of the current time
year = time.year #grab the year of the current time

day = day - 14
def delete_old_files(dir, time)
Dir.chdir(dir) do
Dir.foreach(".") do |entry|
next if File.stat(entry).directory? #prevent from deleting
directories

#Use the modification time
if File.mtime(entry) < time
  File.unlink(entry)
end
end
end
end

cleanup_dirs = ["E:/oracle/MB4/oraarch/", "E:/oracle/MB3/oraarch/",
"E:/oracle/MB5/oraarch", "F:/oracle/MBA/oraarch/", "F:/oracle/MB2/
oraarch/", "F:/oracle/MB3/oraarch/", "F:/oracle/MB/oraarch/"]
cleanup_dirs.each do |cleanup_directory|

delete_old_files(cleanup_directory,Time.local(year,month,day,00,00,0))

end

I should probably use a block or proc or something like that. Any
advice is greatly appreciated. I'm getting the argument out of range