我正在运行一个脚本来修复 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>
您可以对文件和目录使用前缀F
in 。--chmod
D
答案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 所独有的。 ([
test
foo ? bar : baz
作为奖励,您可以对目录和文件使用不同的模式.)
事实上,如果您是 Perl 新手,则可能需要解释这些选项。稍微简化一下:
- 意思
-n
是“为 STDIN 的每一行运行一次,设置$_
为该行” -l
使每行末尾的换行消失(因为否则它会成为 的一部分$_
)-e
认识的人都熟悉sed
;它说这是要评估/运行的表达式。