同时 chmod 和 chown ?

同时 chmod 和 chown ?

我正在运行一个脚本来修复 rsync 后的文件所有权和权限。除了完成任务的最佳方式的问题之外,我想知道是否有一种方法可以chmod同时运行chown

在我的脚本的当前迭代中,我对find文件进行了两次处理。

find /var/www/mysite -exec chown  www-data:www-data {} \;
find /var/www/mysite -type f -exec chmod 775 {} \;

我认为如果我可以使用单个命令更改权限和所有者/组,那就太好了。经过一番谷歌搜索后,我惊讶地发现这样的命令、参数或选项并不存在。

我可以同时更改权限和所有权,以避免find每个文件两次?

编辑社区编辑或帖子或其他内容表明该问题与以下问题重复“使用 1 个命令更改所有文件夹权限”。这个问题是不同的,因为它询问的是改变两个都权限 所有权同时,不仅仅是权限。

答案1

您可以传递多个 exec 命令:

find /var/www/mysite -exec chown www-data:www-data {} \; \
     -type f -exec chmod 775 {} \;

答案2

您可以将等效选项添加到rsync命令中:

rsync <your_options> --chown www-data:www-data --chmod=F775 <source> <destination>

您可以对文件和目录使用前缀Fin 。--chmodD

答案3

为了完整性参数也可以在管道中做各种有趣的事情。

find . -type f -print0 | xargs -0 -I VAR -- sh -c 'chmod 775 "VAR" && chown www-data:www-data "VAR" '

这会生成一个文件名流(不是目录名),分隔符为空,因此处理文件名中的空格。

-0告诉 xargs 在 null 上分隔输入。
-I VAR说用作VAR“变量名称”而不是{}
--它后面的所有内容是每行运行的内容

这可能更具可读性,但每次运行双管命令都会启动一个新的 shell。

答案4

如果您担心find每个文件两次,您可能还需要担心通过 xargs 运行命令组合会产生的分叉数量。

人们常常忘记 perl 具有许多这些基本 shell 命令的等效命令。这是我执行此操作的一种方法(经过测试):

find | perl -lne 'chown 1001,1001, $_; -d $_ ? chmod(0755, $_) : chmod(0644, $_)'

你必须使用数字uid、gid 和 mode,但请考虑一下:这根本不会分叉(超越一find和一perl)。

而且你也不需要了解很多 Perl 来理解它。

chown 和 chmod 已经很清楚了。 与 shell或命令-d中的相同,并且三元运算符不是 perl 所独有的。 ([testfoo ? bar : baz作为奖励,您可以对目录和文件使用不同的模式.)

事实上,如果您是 Perl 新手,则可能需要解释这些选项。稍微简化一下:

  • 意思-n是“为 STDIN 的每一行运行一次,设置$_为该行”
  • -l使每行末尾的换行消失(因为否则它会成为 的一部分$_
  • -e认识的人都熟悉sed;它说这是要评估/运行的表达式。

相关内容