2012-11-03 2 views
0

내가 찾아 폴더에서 가장 오래된 AVI 파일을 삭제하는 루비 스크립트를 작성하기 위해 노력했습니다 오래된 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 

그러나 : 나는 아주 가까운 script in Python을 발견, 내가 가진 루비 솔루션에 자신을 좋은 시작을 얻었다. 어떤 도움을 주시면 감사하겠습니다!


편집 :

이 솔루션이었다

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)}''movie_file_paths' 배열을 수정하지 않습니다. 새로운 정렬 된 배열을 반환합니다. 당신은 수행해야합니다 '영화 = movie_file_paths.sort_by를 {| f를 | 내가 나가서 설명하자면 NameError를 얻을 = movies.first' – rohit89

답변

1

사용 File.mtime(filename)는 파일의 마지막 수정 시간을 얻을 수 있습니다.

movie_file_path.sort_by {|f| File.mtime(f)}mtime하여 정렬 된 배열을 반환합니다. 그런 다음 File.delete(filename)을 사용하여 파일을 삭제할 수 있습니다.

편집 : 마지막으로 액세스 한 시간은 atime 일 수 있으며, mtime보다 더 좋은 옵션 일 수 있습니다.

+0

File.mtime (F)}' 'deleteme : 정의되지 않은 지역 변수 또는 메소드'movie_file_path의 주요위한 : 내 일상 –

+0

의'movie_file_paths'의 끝에서이 프로그램을 실행하려고 객체 – rohit89

+0

그래, 그게 다야. 감사! –

2

File 번, 또는 "마지막 액세스"시간에 대한 atime "마지막으로 수정 한"특별히 ctime에 대한 mtime 당신이 원하는 경우, (NTFS에서 생성 시간) 시간을 "마지막 변경", 당신이 원하는 방법이있다. Dir::glob과이 결합하면, 당신은 쉽게 날짜별로 정렬 된 파일의 목록을 얻을 수 있습니다 : 마지막 하나를 삭제

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

매우 간단합니다 :

File.delete videos.last 
+0

'Dir [ '/ Users/jody/Movies/*. avi'] .min_by (& : ctime)'이 더 간단합니다. – Reactormonk

+0

감사합니다. 이들 중 어느 것도 재귀적일 수 없으므로 하위 폴더 중 하나도 가져 오지 못합니다. 나는 sort_by –

+0

또한 ctime이 오류가 발생합니다. Windows NTSF만이 파일 생성 시간을 저장합니다. 그렇지 않으면 다른 OS의 경우 변경 시간입니다. –

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)})