[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

pulling elements into a method...

grooveska

2/6/2008 10:16:00 PM

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.
4 Answers

Robert Klemme

2/6/2008 10:40:00 PM

0

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
> 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.

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

7stud --

2/6/2008 10:41:00 PM

0

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-....

7stud --

2/6/2008 10:51:00 PM

0

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-....

Todd Benson

2/6/2008 10:51:00 PM

0

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

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