Dette er mit løsningsforslag til
Januar 2015 - Recursion
Ja, det tog nok lidt overhånd da jeg lavede det. Og rodede videre med det, efter jeg havde løst udfordringen.
recursive.rb:
#!/usr/bin/env ruby
$layer = 0 # Til indryk
# Help
def usage
puts "Brug: ./recursive.rb <mappe>"
puts "F.eks. ./recursive.rb /home"
end
# Rekursiv metode
def examine_dir(_entry)
Dir.chdir(_entry) # cd
_return = Dir.pwd # Gem working dir til efter et rekursivt kald
Dir.foreach(_entry) do |entity| # loop gennem elementer
next if entity == "." or entity == ".." # Ingen deadlock
if File.directory? entity # Er element et dir?
$layer += 1 # Indryk
puts "\n#{"\t" * ($layer - 1)}<dir>\tCreated: #{File.ctime(entity).asctime})\t|#{entity}|\t(Layer: #{$layer})" # Vis dirnavn
examine_dir(Dir.pwd + "/" + entity) # Rekursivt kald
$layer -= 1 # Tilbageryk
Dir.chdir(_return) # Returner til det dir vi kom fra
else # Det er en fil
puts "#{"\t" * $layer}<File>\t(Size: #{File.size(entity)} Bytes)\t(Modified: #{File.mtime(entity).asctime})\t(Perm: #{File.stat(entity).mode.to_s(8)})\t|#{entity}|\t(iNode: 0x#{File.stat(entity).ino.to_s(16).upcase})\t(Owner: U:#{File.stat(entity).uid}/G:#{File.stat(entity).gid})" # Vis filnavn med detaljer
end
end
end
# Main
if ARGV.size != 1 then # Argument eller usage screen
usage
else
examine_dir(ARGV[0]) # Start kald til rekursiv funktion
end
Når det køres, ser der således ud:
Citer:root@kalibox:~/code/ruby/ss# ./recursive.rb ./
<File> (Size: 763 Bytes) (Modified: Sat Aug 1 03:40:11 2015) (Perm: 100744) |bitcoin.rb| (iNode: 0xB60D1A) (Owner: U:0/G:0)
<File> (Size: 1272 Bytes) (Modified: Fri Jun 5 19:18:28 2015) (Perm: 100744) |recursive.rb| (iNode: 0xB60D1B) (Owner: U:0/G:0)
<File> (Size: 207 Bytes) (Modified: Fri Jun 5 19:18:28 2015) (Perm: 100744) |fizzbuzz.rb| (iNode: 0xB60D1C) (Owner: U:0/G:0)
root@kalibox:~/code/ruby/ss#
En udfordring er, ikke at ryge i en uendelig lykke på grund af "." og "..".