私はしばらくの間、これに対する解決策を見つけようとしてきました。私は再帰に関する質問と回答を見つけましたが、この特定の状況に合うようなものは何も見つかりませんでした。再帰メソッドが呼び出し元の前の行の位置に戻っていない
特定の検索パターンが見つかった場合は、指定されたフォルダとすべてのサブフォルダとファイルとフォルダの名前を変更するクラスを作成しました。
すべてが正常に動作し、replaceAllInDirが呼び出されると、必要に応じてファイルとフォルダが置き換えられます。次のステップは、指定されたフォルダ内のすべてのサブフォルダに対して同じ操作を実行することです。 したがって、サブフォルダは特定され、replaceAllInDirはその内部から呼び出されます。呼び出される特定のサブフォルダにサブフォルダが含まれていないと仮定します。私は親フォルダに戻り、他のサブフォルダを探し続けることを期待します。しかし、代わりにコントロールは親の呼び出しメソッドに返されず、プログラムは終了します。
私は実際のユースケースを解決する他の方法を知っていますが、私はルビーの動作を説明することはできません。
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
あなたのロジックは大丈夫です(あなたのルビーコーディング規則は普通よりも小さいですが))。あなたは理論的に再帰的にすべきディレクトリへのパスを出力しようとしましたか?これは、名前変更されたディレクトリの名前が何らかのキャッシュのために見えている可能性があります。したがって、 'File.directory?'は、 'dirlist'を2回目に反復するときにtrueを返しません。 – d11wtq