Use procs and make them recursive for extra fruitiness.
The Hash#delete_if method takes a proc and, if it returns true, the element will be deleted. Careful: this is a mutating method, operating on the original object and doesn't return a copy.
deep_clean = Proc.new do |k, v|
v.delete_if(&deep_clean) if v.kind_of?(Hash)
k == :delete_me || v.nil? || v.empty?
end
hsh.delete_if(&deep_clean)
Tweak line 3 to get the outcome you need. Be careful of using the &s right when copying the above.