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: 
You can do it with grep only (without using find):

```
grep --include=\*.{xml,py} -Rl ./ -e "Jason"

```

And to exclude .po:

```
grep --exclude=*.po --include=\*.{xml,py} -Rl ./ -e "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

```