Question: I'd like to know how could I find all files whose extension can be `.xml` and `.py` that contain the string "Jason" under a path "./" recursively?

Or how could I exclude `.po` from the search?

Answer: 
This can be done with combining `find` and `grep`. Here is a small demo - I have test directory with 6 txt and rtf files, two of which contain string "Jason". 

```
CURRENT DIR:[/home/xieerqi/testdir]
$ find . -type f \( -iname "*.txt" -o -iname "*.rtf" \) -exec grep -iR 'jason' {} +                                        
./foo1.txt:Jason
./bar1.txt:Jason

CURRENT DIR:[/home/xieerqi/testdir]
$ ls                                                                                                                       
bar1.rtf  bar1.txt  bar2.rtf  bar2.txt  foo1.rtf  foo1.txt  foo2.rtf  foo2.txt

CURRENT DIR:[/home/xieerqi/testdir]
$ find . -type f \( -iname "*.txt" -o -iname "*.rtf" \) -exec grep -iR 'jason' {} +                                        
./foo1.txt:Jason
./bar1.txt:Jason

```

We find all the files with txt and rtf extensions here and give them all as parameters to grep. The `.` means search in current directory, but you could specify another path and `find` will descend into that directory and subdirectories, to search recursively.

Replacing extensions with yours, the final answer is

```
find . -type f \( -iname "*.xml" -o -iname "*.py" \) -exec grep -iR 'jason' {} + 

```
The best solution probably has been given already by nobody, however when the tool doesn't support searching a directory recursively for filenames one can enable the `globstar` option of `bash` and perform a recursive globbing:

```
shopt -s globstar; grep -F -l Jason **/*.{xml,py}

```

```none
user@user-X550CL:~/tmp$ tree -a
.
└── dir1
    └── dir
        ├── containing_Jason.py
        ├── containing_Jason.txt
        ├── containing_Jason.xml
        ├── not_containing_Jason.py
        ├── not_containing_Jason.txt
        └── not_containing_Jason.xml

2 directories, 6 files
user@user-X550CL:~/tmp$ shopt -s globstar
user@user-X550CL:~/tmp$ grep -F -l Jason **/*.{xml,py}
dir1/dir/containing_Jason.xml
dir1/dir/containing_Jason.py

```

The equivalent feature in `zsh` is enabled by default:

```
grep -F -l Jason **/*.{xml,py}

```

```none
user@user-X550CL ~/tmp % tree -a                       
.
└── dir1
    └── dir
        ├── containing_Jason.py
        ├── containing_Jason.txt
        ├── containing_Jason.xml
        ├── not_containing_Jason.py
        ├── not_containing_Jason.txt
        └── not_containing_Jason.xml

2 directories, 6 files
user@user-X550CL ~/tmp % grep -F -l Jason **/*.{xml,py}
dir1/dir/containing_Jason.xml
dir1/dir/containing_Jason.py

```