You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
66 lines
1.4 KiB
Plaintext
66 lines
1.4 KiB
Plaintext
10 years ago
|
#!/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
|