将 chmod 和 chown 命令动态应用到 f​​ind 命令的输出

zil*_*anu 2 find chmod chown

我在根目录中的许多目录中有一个文件。我需要对所有文件应用 chmod 640 和 chown 命令。我有两个命令,一个是查找文件路径,另一个是应用 chmod 和 chown。如何将 chmod 和 chown 应用于 find 命令的输出

例子:

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
Run Code Online (Sandbox Code Playgroud)

ctx*_*ctx 5

使用 find 的 -exec 标志对结果运行命令:

find . -type f -name 'myawesomeapp.jar' -exec chmod 640 {} \+ -exec chown root:webapps {} \+
Run Code Online (Sandbox Code Playgroud)

在您的情况下,您想使用 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.
Run Code Online (Sandbox Code Playgroud)

{}是将传递的文件名的替换标记find

  • 请注意,使用 `;`,只有在 `chmod` 成功时才会执行 `chown`。使用 `+` 执行 chmod 和 chown,而不管彼此的退出状态如何,并且尽可能多地将文件作为参数传递。在任何情况下,如果任何命令出现故障,stderr 上都会出现错误,但问题不会反映在 `find` 的退出状态中。 (2认同)