Remove the "/" to index redirects, then wait for a complete indexing cycle and see what Google does. If you start to see any of the "/" URLs re-appearing in the search results, that would be a strong indicator that Google "prefers" "/" over "/index.xyz".
After this, correct all on-site links to point to /dir/ instead of /dir/index.htm
After you've waited for another indexing cycle, it should then be safe to put the /dir/index.htm to /dir/ redirect in place. Basically, we're just trying to make sure that G has noticed that the original redirect is gone before putting the new (reversed) one in place.
As phranque observes above, "the server should be configured so that index.htm(l) is the default directory index document." This is done with an internal rewrite implemented by mod_dir's DirectoryIndex directive. DirectoryIndex rewrites the client-requested
URL-path "/dir/" to the
file-path "/dir/index.htm"
Because this is an internal rewrite, you cannot simply add code that redirects *all* requests for "/dir/index.htm" to "/dir/" because that would lead to an 'infinite' rewrite/redirect loop as a result of the DirectoryIndex and redirect directives repeatedly countermanding each other. Therefore, you need to make sure that the request for "/index.htm" is coming directly from the HTTP client, and is not being requested as a result of mod_dir's internal rewrite.
With mod_rewrite, this can generally be done in two ways, with equivalent results:
# Externally redirect direct client requests "/index.htm" in any directory to "/" in that directory
RewriteCond %{THE_REQUEST} ^[A-Z]+\ /([^/]+/)*index\.htm([?#][^\ ]*)?\ HTTP/
RewriteRule ^(([^/]+/)*)index\.htm$ http://www.example.com/$1 [R=301,L]
-or-
# Externally redirect direct client requests "/index.htm" in any directory to "/" in that directory
RewriteCond %{REDIRECT_STATUS} ^$
RewriteRule ^(([^/]+/)*)index\.htm$ http://www.example.com/$1 [R=301,L]
Jim