递归查找和删除最旧的AVI文件

时间:2012-11-03 20:20:34

标签: ruby

我一直在尝试编写一个Ruby脚本来查找和删除文件夹中最旧的AVI文件。我找到了一个非常接近的script in Python,我自己在Ruby解决方案上有了一个良好的开端:

require 'fileutils'
stat = Sys::Filesystem.stat("/")
mb_available = stat.block_size * stat.blocks_available / 1024 / 1024
#if there is less than 130MB free
if mb_available < 130000
    require 'find'
    movie_file_paths = []
    #grab all the files in the folder
    Find.find('/Users/jody/Movies') do |path|
        movie_file_paths << path if /.*\.avi/.match(path) != nil
    end
end

但是,我和其他人一起度过了艰难的时光。任何帮助将不胜感激!


编辑:

这是解决方案:

movie_file_paths = []
Dir.glob("/Users/jody/Movies/**/*.avi").each { |file| movie_file_paths << file if File.file? file }
movie_file_paths.sort_by {|f| File.mtime(f)}
deleteme = movie_file_paths.first

3 个答案:

答案 0 :(得分:3)

我看到你已经选择了一个答案,但它可以是一个单行:

File.delete(Dir.glob("/Users/jody/Movies/**/*.avi").sort_by{|f| File.mtime(f)}.first)

更新:几年后我偶然发现了这一点,并且自己想,&#34;我可以做得更短!&#34;

File.delete(Dir["/Users/jody/Movies/**/*.avi"]).min_by{|f| File.mtime(f)})

答案 1 :(得分:2)

File包含您想要的方法,特别是ctime用于“最后更改”次数(NTFS上的创建时间),mtime如果您想要“上次修改”次数,或{atime 1}}表示“上次访问”次数。将其与Dir::glob相结合,您可以轻松获取按日期时间排序的文件列表:

videos = Dir['/Users/jody/Movies/*.avi'].sort_by(&:ctime)

删除最后一个非常简单:

File.delete videos.last

答案 2 :(得分:1)

使用File.mtime(filename)获取文件的上次修改时间。

movie_file_path.sort_by {|f| File.mtime(f)}将按mtime返回已排序的数组。然后,您可以使用File.delete(filename)删除该文件。

修改:上次访问时间atime可能是比mtime更好的选择。