linux shell:find -exec 中的 find -exec

linux shell:find -exec 中的 find -exec

我想chmod 555使用以下命令对获得的所有文件和目录执行(它返回目录 test 及其中的所有文件和目录):

find ~/.config/google-chrome -type d -name test -exec find {} \;

答案1

在这种情况下,您可以chmod -R按照用户26112的回答,但在一般情况下,你可以这样做:

find ~/.config/google-chrome -type d -name test -exec sh -c '
  for i do
    find "$i" -exec chmod 555 {\} +
  done' sh {} +

技巧是使用 shell 并使用引用(如{\}{"}"),以便内部{}不会被外部扩展find(考虑到即使它只是参数的一部分,find那些实现仍然会扩展)。{}

GNU find4.9.0 或更高版本还支持从 stdin 获取要处理的文件列表作为 NUL 分隔记录,因此您可以执行以下操作:

find -files0-from <(
    find ~/.config/google-chrome -type d -name test -print0
  ) -exec chmod 555 {} +

对于旧版本,您可以使用 GNU 执行类似的操作xargssh重新排序参数:

xargs -r0a <(
    find ~/.config/google-chrome -type d -name test -print0
  ) sh -c 'exec find "$@" -exec chmod 555 {} +' sh

<(...)流程替代,zsh 和 bash 也支持的 ksh 功能,不要与yash's混淆进程重定向)。

答案2

您可以使用chmod-R标志来更改目录以及其下层次结构中的所有文件和目录的权限。

find ~/.config/google-chrome -type d -name test -exec chmod -R 555 '{}' \;

答案3

如果您确实想要两个find -exec,请尝试以下操作

find /etc -type f -exec sh -c 'find "$0" -exec echo {\} \;' {} \;

(这将传递给echo命令find找到的内容)

find /etc -type d -exec sh -c 'find "$0" -type f -exec echo "$0" {\} \;' {} \;

(一些有用的示例:打印目录名称和其中的文件列表)

通过使用,sh -c您还可以解决find -exec子句中管道的问题,还要注意传递的参数将从而不是像 shell 脚本通常那样sh -c从开始。$0$1

答案4

您也可以运行此命令。它将在每个目录上运行,但+参数find将运行chmod作为参数传递的多个“测试”目录:

$ find ~/.config/google-chrome -type d -name test -exec chmod -R 555 '{}' +

相关内容