1

フォルダー内の最も古いAVIファイルを見つけて削除するRubyスクリプトを作成しようとしています。私は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
4

3 に答える 3

3

あなたはすでに答えを選択しているようですが、それはワンライナーである可能性があります:

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)})
于 2012-11-04T01:44:41.473 に答える
2

File特にctime「最終変更」時間(NTFSでの作成時間)、mtime「最終変更」時間、またはatime「最終アクセス」時間に必要なメソッドがあります。これをと組み合わせるとDir::glob、日時でソートされたファイルのリストを簡単に取得できます。

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

最後のものを削除するのは非常に簡単です。

File.delete videos.last
于 2012-11-03T20:50:02.557 に答える
1

File.mtime(filename)ファイルの最終変更時刻を取得するために使用します。

movie_file_path.sort_by {|f| File.mtime(f)}でソートされた配列を返しmtimeます。その後、を使用してファイルを削除できますFile.delete(filename)

編集:最終アクセス時刻atimeは、よりも適切なオプションである可能性がありますmtime

于 2012-11-03T20:42:35.317 に答える