clearcase: find -name not allow multiple patterns? - find

I wanna find *.cs and *.cpp files through cleartool find command. But it failed.
cleartool find "M:\test_view\code" -name "*.cs *.cpp" -print
Nothing can be found based on above even there are matched files in that folder.
How to set multiple file-name patterns ?

The query language offer some possibility for Compound queries (query || query)
But the cleartool find has none of those operators for the -name option.
The best you can do, following the cleartool wildcard syntax, is
cleartool find "M:\test_view\code" -name "*.c[sp]*" -print

This is a bit late but perhaps this will help someone.
One option is to wrap this is a for loop:
:: namelist.txt contains a list of file types ( *.cs, *.cpp, )
FOR /F "tokens=1" %%A IN (c:\bin\namelist.txt) DO ( cleartool find "M:\test_view\code" -all -type f -name %%A -print)

It lookslike cleartool wraps the unix style find utility.
If that is right you might be able to use '-or'
$ find -type f -name '*.cs' -or '*.cpp' -print

Related

Using find for complex AND/OR string search

I use a script using find to search my multimedia collection. This previously worked until I began to add movie trailers, all of which use the naming format -trailer.
I want to use find to locate all files matching *.mkv, *.mp4, or *.avi, while excluding any file containing the string fragment "-trailer.", even if it matches the first criteria (ie, exclude file moviename-trailer.mkv). However, the following includes all trailers in the result.
find . -type f -iname '*.mkv' -or -iname '*.mp4' -or -iname '*.avi' -not -iname '*trailer.*'
I have changed the order of search without success, by trying to first exclude all trailers, and then search on the remainder.
I suspect that find encounters a file such as *-trailer.mkv, flags this as true and prints it, and then looks for the next file, before getting to the condition of excluding it.
Is there a way to nest the search with parenthesis following this logic: find all files (*.mkv OR *.mp4 OR *.avi) and not (*-trailer.*)?
Thanks much.
duda#coolomet:~/test$ touch a.mp4
duda#coolomet:~/test$ touch a-trailer.mp4
duda#coolomet:~/test$ find . -type f -iname '*.mkv' -or -iname '*.mp4' -or -iname '*.avi' -not -iname 'trailer.'
./a.mp4
./a-trailer.mp4
duda#coolomet:~/test$ find . -type f \( -iname '*.mkv' -or -iname '*.mp4' -or -iname '*.avi' \) -and -not -iname '*trailer.*'
./a.mp4
duda#coolomet:~/test$
You need to do a proper logical expression and have proper wildcards in iname arguments.
find . | grep -P '^(((?!-trailer).)*\.((mkv|avi|mp4)))$'
will return
./movie.avi
./movie.mkv
./movie.mp4
when the current directory contains the files
./movie-trailer.avi
./movie-trailer.mkv
./movie-trailer.mp4
./movie.avi
./movie.mkv
./movie.mp4

remove multiple files using find and rm in perl

I have a few text files in my directory which need to be removed. There are a bunch of text files in my directory:
leaves_emp1.txt
pay_emp1.txt
pf_emp1.txt
leaves_emp2.txt
pay_emp2.txt
pf_emp2.txt
[...]
I've tried using the following code to remove the files containing "emp1":
/usr/bin/find $LogDir -name \"leaves_emp1.txt\" -and -name \"pay_emp1.txt\" -and -name \"pf_emp1.txt\" -exec rm {}
But it is not working. Please help. I tried with -a and -o too. I also tried using the () for the files.
I am just using the code as follows
/usr/bin/find $LogDir -name \"*emp1.txt\" -exec rm {}
You need to avoid fork-bombs. The "exec" call in find will spawn a fork/exec with each file. I find it much easier and scalable to call something like this:
find . -type f -name '*emp1.txt' | perl -lane 'unlink $_ if -f $_' -
Note: if you want to stick with just exec, you must remember to use the "\;" at the end
find . -type f -name '*emp1.txt' -exec rm {} \;

cygwin bash find with prune option not behaving as expected

The two commands below are yielding exactly the same file list in bash under cygwin:
find ../../../../.. -name "*.o" -and -path "*/common/*"
find ../../../../.. -name "*.o" -and -path "*/common/*" -prune
This list includes files such as:
../../../../../platform/abc/common/ppng.o
../../../../../platform/abc/common/variant/pxx.o
The list does not include any files without "common" in their pathnames.
What I'm trying to do is find (and ultimately eliminate) object files in all directories but any that have a "common" directory component. I've tried about 25 other combinations without luck.
Any pointers?
afaik, -path doesn't take regular expressions. I think what you want to do is find all your object files (.*.o) and exclude all the common directories (.*/common/.*):
find . -regex '.*.o' -and -not -regex '.*/common/.*'
You can make it all case insensitive with -iregex if needed.

Linux find command gotcha?

Hi I am trying to find all js & css files in one find command. I tried all of the below but in vain:
find WebContent -name "*.[jc]ss?"
find WebContent -name "*.[jc]ss{0,1}"
find WebContent -name "*.[jc][s]{1,2}$"
find WebContent -name "*.[jc]s{1,2}"
find WebContent -name "*.[jc]s[s]?"
Now what??
-name accepts arguments that are globs, not regular expressions. You could use -regex if you wanted to use regular expressions, but the -o option (meaning "or") is probably the simplest solution:
find WebContent -name "*.js" -o -name "*.css"
Try this
find WebContent -regextype posix-extended -regex '.*\.(css|js)$'
use the -iname option case insensitive
find WebContent \( -iname "*.js" -o -iname "*.css" \)
you can do boolean expressions with find. -o stands for OR.
find -name "*.js" -o -name "*.cpp"

Solaris find command

In Solaris, what is the syntax of find command to find files having multiple file name formats?
Eg: In my current directory and in its sub-directories if I have files like test.log, sample.out, demo.buf and some other files, how can I write single find command to find these 3 files.
this is the correct one
find . \( -name "test.log" -o -name "sample.out" -o -name "demo.buf" \) -print
Same as all other Unixes:
find . -name test.log -o -name sample.out -o name demo.buf