Recursive method not returning to previous line position in caller
I have been trying to find a solution to this for some time. I have found questions and answers on recursion but nothing that seemed to fit this particular situation.

I have written a class which should go through the given folder and all subfolders and rename files and folders if a particular search pattern is found. 

Everything works as expected the replaceAllInDir gets called, it replaces files and folders if needed. The next step then is to do the same for all subfolders within the given folder.
So a subfolder gets identified and replaceAllInDir gets called from within itself. Let's assum the particular subfolder called does not contain any subfolders. I would then expect that we return to the parent folder and continue looking for other subfolders. But instead control is not returned to the parent calling method and the program ends.

I am aware of other ways of solving the actual use case, but I cannot explain the behaviour of ruby.

    class MultiFileAndFolderRename
      attr_accessor :rootDir, :searchPattern, :replacePattern
    
      def initialize(rootDir, searchPattern, replacePattern)
        @rootDir = rootDir
        @searchPattern = searchPattern
        @replacePattern = replacePattern
      end
    
      def execute
        replaceAllInDir(@rootDir)
      end
    
      def getValidDirEntries(dir)
        dirList = Dir.entries(dir)
        dirList.delete('.')
        dirList.delete('..')
        dirList
      end
    
      def replaceAllInDir(currentDir)
        Dir.chdir(currentDir)
        puts "Processing directory: " + Dir.pwd
        dirList = getValidDirEntries(currentDir)
        dirList.each { |dirEntry|
          attemptRename(dirEntry)
        }
    
        dirList = getValidDirEntries(currentDir)
        dirList.each { |dirEntry|
          if File.directory?(dirEntry)
            newDir = currentDir + '\\' + dirEntry
            rntemp = MultiFileAndFolderRename.new(newDir, 'searchString', 'replaceString')
            rntemp.replaceAllInDir(newDir)
          end
        }
      end
    
      def attemptRename(dirEntry)
        if dirEntry.match(@searchPattern)
          newname = dirEntry.to_s.sub(@searchPattern, @replacePattern)
          FileUtils.mv(dirEntry.to_s, newname)
        end
      end
    end
Recursive method not returning to previous line position in caller
===

I have been trying to find a solution to this for some time. I have found questions and answers on recursion but nothing that seemed to fit this particular situation.

I have written a class which should go through the given folder and all subfolders and rename files and folders if a particular search pattern is found. 

Everything works as expected the replaceAllInDir gets called, it replaces files and folders if needed. The next step then is to do the same for all subfolders within the given folder.
So a subfolder gets identified and replaceAllInDir gets called from within itself. Let's assum the particular subfolder called does not contain any subfolders. I would then expect that we return to the parent folder and continue looking for other subfolders. But instead control is not returned to the parent calling method and the program ends.

I am aware of other ways of solving the actual use case, but I cannot explain the behaviour of ruby.

    class MultiFileAndFolderRename
      attr_accessor :rootDir, :searchPattern, :replacePattern
    
      def initialize(rootDir, searchPattern, replacePattern)
        @rootDir = rootDir
        @searchPattern = searchPattern
        @replacePattern = replacePattern
      end
    
      def execute
        replaceAllInDir(@rootDir)
      end
    
      def getValidDirEntries(dir)
        dirList = Dir.entries(dir)
        dirList.delete('.')
        dirList.delete('..')
        dirList
      end
    
      def replaceAllInDir(currentDir)
        Dir.chdir(currentDir)
        puts "Processing directory: " + Dir.pwd
        dirList = getValidDirEntries(currentDir)
        dirList.each { |dirEntry|
          attemptRename(dirEntry)
        }
    
        dirList = getValidDirEntries(currentDir)
        dirList.each { |dirEntry|
          if File.directory?(dirEntry)
            newDir = currentDir + '\\' + dirEntry
            rntemp = MultiFileAndFolderRename.new(newDir, 'searchString', 'replaceString')
            rntemp.replaceAllInDir(newDir)
          end
        }
      end
    
      def attemptRename(dirEntry)
        if dirEntry.match(@searchPattern)
          newname = dirEntry.to_s.sub(@searchPattern, @replacePattern)
          FileUtils.mv(dirEntry.to_s, newname)
        end
      end
    end