Applying the chmod and chown commands dynamically to the output of find command

5,491

Solution 1

Use the -exec flag of find to run commands on the results:

find . -type f -name 'myawesomeapp.jar' -exec chmod 640 {} \+ -exec chown root:webapps {} \+

In your case you want to use the second variant of exec:

-exec command ;
    Execute command; true if 0 status is returned.  All following  argu‐
    ments  to  find  are  taken  to be arguments to the command until an
    argument consisting of `;'  is  encountered.   The  string  `{}'  is
    replaced  by  the  current  file  name being processed everywhere it
    occurs in the arguments to the command, not just in arguments  where
    it  is  alone, as in some versions of find.  Both of these construc‐
    tions might need to be escaped (with a `\')  or  quoted  to  protect
    them  from  expansion  by  the  shell.  See the EXAMPLES section for
    examples of the use of the -exec option.  The specified  command  is
    run  once  for  each  matched  file.  The command is executed in the
    starting directory.   There are unavoidable security  problems  sur‐
    rounding use of the -exec action; you should use the -execdir option
    instead.

-exec command {} +
    This variant of the -exec action runs the specified command  on  the
    selected  files,  but  the  command  line is built by appending each
    selected file name at the end; the total number  of  invocations  of
    the command will be much less than the number of matched files.  The
    command line is built in much the same way  that  xargs  builds  its
    command lines.  Only one instance of `{}' is allowed within the com‐
    mand.  The command is executed in the starting directory.   If  find
    encounters  an error, this can sometimes cause an immediate exit, so
    some pending commands may not be run at all.  This variant of  -exec
    always returns true.

{} is the substitution token for the filenames that will be passed on find.

Solution 2

tee clone the pipe and xargs feeds every command with arguments:

find -name 'myawesomeapp.jar' -print0 | tee >(xargs -0 chown root:webapps) | xargs -0 chmod 640
Share:
5,491

Related videos on Youtube

zilcuanu
Author by

zilcuanu

Updated on September 18, 2022

Comments

  • zilcuanu
    zilcuanu almost 2 years

    I have a file inside many directory from within a root directory. I need to apply the chmod 640 and chown command on all the files. I have two commands, one to find the file paths and the other is to apply the chmod and chown. How can I apply the chmod and chown to the output of the find command

    Example:

    find . -type f -name 'myawesomeapp.jar'
    
    chmod 640 /path/to/file/myawesomeapp.jar
    chown root:webapps /path/to/file/myawesomeapp.jar
    
    chmod 640 /path/to/another/file/myawesomeapp.jar
    chown root:webapps /path/to/another/file/myawesomeapp.jar
    
  • Stéphane Chazelas
    Stéphane Chazelas over 7 years
    Note that with ;, the chown would only be done if the chmod was successful. With + the chmod and chown are performed regardless of the exit status of each other and with as many files passed as argument as possible. In any case, if there are some failures for any of the commands, there will be errors on stderr, but the problem will not be reflected in find's exit status.