-x PAT --exclude=PAT
Exclude files that match PAT.
-X FILE --exclude-from=FILE
Exclude files that match any pattern in FILE.
So it looks like -x only accepts one pattern as you report but if you put all the patterns you want to exclude in a file (presumably one per line) you could use the second flag like so:
From the Comparing Directories section of info diff (on my system, I have to do info -f /usr/share/info/diff.info.gz):
To ignore some files while comparing directories, use the '-x
PATTERN' or '--exclude=PATTERN' option. This option ignores any files
or subdirectories whose base names match the shell pattern PATTERN.
Unlike in the shell, a period at the start of the base of a file name
matches a wildcard at the start of a pattern. You should enclose
PATTERN in quotes so that the shell does not expand it. For example,
the option -x '*.[ao]' ignores any file whose name ends with '.a' or
'.o'.
This option accumulates if you specify it more than once. For
example, using the options -x 'RCS' -x '*,v' ignores any file or
subdirectory whose base name is 'RCS' or ends with ',v'.
We can do one workaround, a exclude file with all files but what we want include. So we create file1 with a find all files which don't have extensions that we want include, sed catch the filename and is just :
I used the following command to find the diff of all *.tmpl files between DIR1 and DIR2. In my case this didn't yield any false positives, but it may for you, depending on the contents of your DIRS.
Whilst it does not avoid the actual diff of other files, if your goal is to produce a patch file, or similar then you can use filterdiff from the patchutils package, e.g. to patch only your .py changes: