66 lines
		
	
	
	
		
			1.4 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
		
		
			
		
	
	
			66 lines
		
	
	
	
		
			1.4 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
|  | #!/usr/bin/env ruby | ||
|  | # Find | ||
|  | # unused | ||
|  | # directories | ||
|  | # by | ||
|  | # looking | ||
|  | # at | ||
|  | # the | ||
|  | # atimes | ||
|  | # of | ||
|  | # the | ||
|  | # contained | ||
|  | # files. | ||
|  | # | ||
|  | require 'optparse' | ||
|  | 
 | ||
|  | options = {} | ||
|  | options[:days] = 180 | ||
|  | 
 | ||
|  | def used_recently?(path, days) | ||
|  |   if File.directory?(path) | ||
|  |     used_recently = false | ||
|  |     empty = true | ||
|  |     Dir.new(path).each do |entry| | ||
|  |       if entry != "." && entry != ".." | ||
|  |         empty = false | ||
|  |         if used_recently?("#{path}/#{entry}", days) | ||
|  |           used_recently = true | ||
|  |         end | ||
|  |       end | ||
|  |     end | ||
|  |     if !used_recently && !empty | ||
|  |       puts "unused: #{path}" | ||
|  |     end | ||
|  |     return used_recently | ||
|  |   elsif File.file?(path) || File.socket?(path) || File.symlink?(path) | ||
|  |     return (File.lstat(path).atime >= Time.now() - (days * 24 * 3600)) | ||
|  |   else | ||
|  |     puts "Unknown file type: #{path}" | ||
|  |     exit 1 | ||
|  |   end | ||
|  | end | ||
|  | 
 | ||
|  | # Parse options | ||
|  | OptionParser.new do |opts| | ||
|  |   opts.banner = "Usage: #{$0} [options] DIRECTORY..." | ||
|  |    | ||
|  |   opts.separator "" | ||
|  |   opts.separator "Find unused (sub-)directories, recursively traversing DIRECTORY, by looking at the atime(s) of all contained files. A directory is considered unused if ALL of the contained files weren't accessed for DAYS days (default is 180 days.)" | ||
|  |   opts.separator "" | ||
|  |    | ||
|  |   opts.on("-d", "--days DAYS", Integer, | ||
|  |           "Days after a file is considered unused") do |d| | ||
|  |     options[:days] = d | ||
|  |   end | ||
|  | end.parse! | ||
|  | 
 | ||
|  | dirs = ARGV | ||
|  | if dirs.length == 0 | ||
|  |   dirs = "." | ||
|  | end | ||
|  | 
 | ||
|  | dirs.each do |dir| | ||
|  |   used_recently?(dir, options[:days]) | ||
|  | end |