2

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 

2 Answers 2

5

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.

1
  • 2
    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. Commented Feb 27, 2017 at 13:05
3

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 

You must log in to answer this question.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.