Skip to content

Files

Latest commit

 

History

History
38 lines (22 loc) · 1.23 KB

SC2146.md

File metadata and controls

38 lines (22 loc) · 1.23 KB

Pattern: Malformed precedence for find -o

Issue: -

Description

In find, two predicates with no operator between them is considered a logical, short-circuiting AND (as if using -a). E.g., -name '*.mkv' -exec .. is the same as -name '*.mkv' -a -exec ...

-a has higher precedence than -o, so -name '*.avi' -o -name '*.mkv' -a -exec .. is equivalent to -name '*.avi' -o \( -name '*.mkv' -a -exec .. \).

Example of incorrect code:

find . -name '*.avi' -o -name '*.mkv' -exec cp {} /media \;

This means "if name matches *.avi, do nothing. Otherwise, if it matches *.mkv, execute a command.".

Example of correct code:

find . \( -name '*.avi' -o -name '*.mkv' \) -exec cp {} /media \;

We use \( \) to group to get the evaluation order we want. The correct code means "if name matches *.avi or *.mkv, then execute a command", which was what was intended.

Exceptions

If you're aware of this, you can either ignore this error or group to make it explicit. For example, to decompress all gz files except tar.gz, you can use:

find . -name '*.tar.gz' -o \( -name '*.gz' -exec gzip -d {} + \)

Further Reading