Try this. Save beforehand in case something goes wrong.
import bpy
for ob in bpy.data.objects:
for slot in ob.material_slots:
try:
name = slot.material.node_tree.nodes['Image Texture'].image.name
except Exception:
continue
name = name[:-6]
if name not in bpy.data.materials:
slot.material.name = name
else:
slot.material = bpy.data.materials[name]
Afterwards, you can use File > Clean Up > Unused Data Blocks to remove the extra unused materials.