Метод вызова каталога при достижении каталога

Попытка написать скрипт, который будет искать в каталоге и подкаталогах определенные файлы. Я хотел бы знать, как определенный каталог или каталоги вызывают метод.

вот что я попробовал и потерпел неудачу:

def display_directory(path)
list = Dir[path+'/*'] 
return if list.length == 0

list.each do |f|     

  if File.directory? f #is it a directory?
    if File.directory?('config')
      puts "this is the config folder"
    end
    printf "%-50s %s\n", f, "is a directory:".upcase.rjust(25)
  else
    printf "%-50s %s\n", f, "is not a directory:".upcase.rjust(25)
  end
 end
end


start = File.join("**")
puts "Processing directory\n\n".upcase.center(30)
display_directory start

это то, что я хочу, чтобы произошло.

        app
app/controllers
app/helpers
app/mailers
app/models
app/models/bugzilla
app/models/security
app/views
app/views/auth
app/views/calendar
app/views/layouts
app/views/step
app/views/step_mailer
app/views/suggestion
app/views/suggestion_mailer
app/views/task
app/views/user
bin
--------------------------------------
config <----------(call method foo)
config/environments
config/initializers
config/locales
--------------------------------------
db
db/bugzilla
db/migrate
db/security
lib
lib/tasks
log
public
public/images
public/javascripts
public/stylesheets
script
script/performance
script/process
--------------------------
test <---------(call method foobar)
test/fixtures
test/fixtures/mailer
test/functional
test/integration
test/performance
test/unit
--------------------------
vendor
vendor/plugins

2 ответа

Я нашел способ. это работает довольно хорошо. Я добавил метод, чтобы показать все файлы в указанном каталоге при достижении.

def special_dir(path)
  puts "------------------------------------"
  sp_path = Dir.glob(File.join(path,"*","**"))
  sp_path.each do |cf|
    puts "\t" + cf
  end
end

def walk(path)
  list = Dir[path+'/*'].reject{ |r| r['doc'] || r['tmp']}
    list.each do |x|
      path = File.join(path, x)
      if File.directory?(x)
        if x =~ /config/ or x =~ /test/  
          special_dir(x)
        else 
          puts "#{x}"
          walk(path)
        end
      else
        #puts x
      end
    end
  end

  start = File.join("**")

  walk start

Вместо

if File.directory?('config')

Пытаться

if f.path.include?('config')

но это будет работать для каждого каталога, который имеет конфигурацию на имя. Вы можете поместить большую подстроку для лучшего соответствия.

Кроме того, это очень идиоматично в использовании рубина do..end для многострочных блоков и {..} для одной строки.

Другие вопросы по тегам