【问题标题】:Find and delete oldest AVI file recursively递归查找和删除最旧的AVI文件
【发布时间】:2012-11-03 20:20:33
【问题描述】:

我一直在尝试编写一个 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

【问题讨论】:

  • 我刚刚看到你的解决方案; movie_file_paths.sort_by {|f| File.mtime(f)} 确实 NOT 修改 movie_file_paths 数组。它返回一个新的排序数组。你应该这样做:movies = movie_file_paths.sort_by {|f| File.mtime(f)}deleteme = movies.first

标签: ruby


【解决方案1】:

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

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

更新:几年后我遇到了这个问题,心里想:“我可以让它更短!”

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

【讨论】:

    【解决方案2】:

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

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

    删除最后一个很简单:

    File.delete videos.last
    

    【讨论】:

    • Dir['/Users/jody/Movies/*.avi'].min_by(&amp;:ctime) 更简单。
    • 谢谢。这些都不是递归的,虽然是正确的,因此不会得到任何子文件夹?
    • “创建时间的 ctime”。只有 Windows NTSF 存储文件的创建时间,否则,对于其他操作系统,它是更改时间。
    【解决方案3】:

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

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

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

    【讨论】:

    • 当我在例程结束时尝试运行它时,我得到 NameError: undefined local variable or method `movie_file_path' for main:Object
    猜你喜欢
    • 2014-06-21
    • 2010-10-24
    • 2016-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-02
    相关资源
    最近更新 更多