简体   繁体   中英

Find all files matching 'name' on linux system, and search with them for 'text'

I need to find all instances of 'filename.ext' on a linux system and see which ones contain the text 'lookingfor'.

Is there a set of linux command line operations that would work?

find / -type f -name filename.ext -exec grep -l 'lookingfor' {} +

Using a + to terminate the command is more efficient than \\; because find sends a whole batch of files to grep instead of sending them one by one. This avoids a fork/exec for each single file which is found.

A while ago I did some testing to compare the performance of xargs vs {} + vs {} \\; and I found that {} + was faster. Here are some of my results:

time find . -name "*20090430*" -exec touch {} +
real    0m31.98s
user    0m0.06s
sys     0m0.49s

time find . -name "*20090430*" | xargs touch
real    1m8.81s
user    0m0.13s
sys     0m1.07s

time find . -name "*20090430*" -exec touch {} \;
real    1m42.53s
user    0m0.17s
sys     0m2.42s

Go to respective directory and type the following command.

find . -name "*.ext" | xargs grep 'lookingfor'

A more simple one would be,

find / -type f -name filename.ext -print0 | xargs -0 grep  'lookingfor'

-print0 to find & 0 to xargs would mitigate the issue of large number of files in a single directory.

Try:

find / -type f -name filename.ext -exec grep -H -n 'lookingfor' {} \;

find searches recursively starting from the root / for files named filename.ext and for every found occurrence it runs grep on the file name searching for lookingfor and if found prints the line number ( -n ) and the file name ( -H ).

I find the following command the simplest way:

grep -R --include="filename.ext" lookingfor

or add -i to search case insensitive:

grep -i -R --include="filename.ext" lookingfor

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM