2012-11-03 4 views
0

Я пытался написать скрипт Ruby для поиска и удаления самого старого файла AVI в папке. Я нашел script in Python, что очень близко, и я получил хороший старт на решение Руби себя с:Найти и удалить старый AVI-файл рекурсивно

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 

Но, у меня трудное время с остальными. Любая помощь будет оценена!


EDIT:

Это было решение:

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 
+0

Я только что видел ваше решение; 'movie_file_paths.sort_by {| f | File.mtime (f)} 'does * NOT * модифицирует массив' movie_file_paths'. Он возвращает новый отсортированный массив. Вы должны сделать: 'movies = movie_file_paths.sort_by {| f | File.mtime (f)} ' ' deleteme = movies.first' – rohit89

ответ

1

Используйте File.mtime(filename), чтобы получить время последнего изменения файла.

movie_file_path.sort_by {|f| File.mtime(f)} вернет отсортированный массив по mtime. Затем вы можете удалить файл, используя File.delete(filename).

Редактировать: Последний доступ к времени atime может быть лучшим вариантом, чем mtime.

+0

Я получаю NameError: неопределенная локальная переменная или метод 'movie_file_path 'для main: Object, когда я пытаюсь запустить это в конце моей подпрограммы –

+0

его' movie_file_paths' – rohit89

+0

Да, это было. Благодаря! –

2

File имеет методы, которые, в частности, ctime для «последнего изменения» времена (времена создания на NTFS), mtime если вы хотите «Последнее изменение» раз или atime для «последнего доступа» времена. В сочетании с Dir::glob, вы можете легко получить список файлов, отсортированных по DateTime:

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

Удаление последний очень просто:

File.delete videos.last 
+0

'Dir ['/ Users/jody/Movies/*. Avi']. Min_by (&: ctime)' проще. – Reactormonk

+0

Спасибо. Ни один из них не был бы рекурсивным, хотя правильным и, следовательно, не получил бы какой-либо из подпапок? –

+0

также ctime генерирует ошибку, когда я пытаюсь выполнить sort_by –

2

Я вижу, вы уже выбрали ответ, но это может быть один вкладыш:

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)}) 
Смежные вопросы