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?
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"
Try the following command. It will search only in the .xml
and .py
files for your name:
find . -type f \( -iname \*.xml -o -iname \*.py \) | xargs grep "Jason"
Hope this helps!
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' {} +
You could do this:
grep -r "Jason" ./ | grep .xml; grep -r "Jason" ./ | grep .py
That will display the output of any files containing Jason
and limit it to filenames containing .xml
or .py
.
If you want to just exclude .po
, then try this:
grep -r "Jason" | grep -v .po
How I understand from your question above, u need to show all files with "Jason" string into. So, may be this can help you:
find . -type f \( -name "*.xml" -o -name "*.py" \) | grep -r "Jason" | cut -d':' -f1 | uniq
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}
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}
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