Warning: preg_replace(): Compilation failed: escape sequence is invalid in character class at offset 4 in /home/customer/www/theunixtips.com/public_html/wp-content/plugins/resume-builder/includes/class.resume-builder-enqueues.php on line 59

bash : search multiple file patterns using single find command

One reader asked how find can be used to find various file patterns. For example in a directory which could be littered with various logs and other files, how do I use a single find command to find all shell scripts, perl scripts and say php scripts. Simple answer is to use multiple -name arguments combined with -o (or ORed) and if needed with -a (or ANDed). Other find conditions (like -mtime, -type etc) can be combined as well. Let’s see an example.

unixite@theunixtips:~/test> ls -1
1.dat
2.txt
33.sh
3.sh
4.pl
5.php
unixite@theunixtips:~/test> find . ( -name "*.sh" -o -name "*.pl" -o -name "*.php" )
./3.sh
./33.sh
./4.pl
./5.php

With above command more patterns can be specified where more ANDing or ORing can be done. For example to search all scripts that start with 3.

unixite@theunixtips:~/test> find . ( ( -name "*.sh" -o -name "*.pl" -o -name "*.php" ) -a ( -name "3*" ) )
./3.sh
./33.sh

Using this user can combine many other conditions (e.g. search for the files with size ranges between 100K and 500K). Or simply if one has a simple pattern to search.

unixite@theunixtips:~/test> find . -name "*.sh" -o -name "*.pl" -o -name "*.php"
./3.sh
./33.sh
./4.pl
./5.php

Note: The brackets have to be escaped correctly and also there should be space between brackets and the patterns.