find
is a utility that searches a directory tree for
files matching complex conditions. The conditions may include file
name, file type, creation/modification time, owner, permissions and
others. Besides, you can define an action to be performed on the files
that match your search criteria.
When I have to run a number of searches, I usually do it
sequentially, but the process may take too much time if the number of
files find
has to inspect is very large. It turns out
that you can define multiple sets of conditions in find
and perform different actions on files that match different
conditions. The utility will traverse the directory only once.
This is how you can define multiple conditions and actions in one
pass of find
:
find /data \( ! -group mygroup -exec chgrp mygroup {} \; \) , \ \( -type f ! -perm -g=rw -exec chmod g+rw {} \; \) , \ \( -type d ! -perm -g=rws -exec chmod g+rws {} \; \)
This command will change group owner for all files that do not
belong to mygroup
, set read and write permissions for the
owning group if the file is a regular file, set read, write and setgid
permissions if the file is a directory. All in a single pass.