Answers:
可以使用以下shell行完成此操作:
D1=foo; D2=foo2; for entry in $(find $D1 -exec stat -f "%N:%Mp%Lp" {} \;); do $(echo $entry | sed 's#'$D1'#'$D2'#' | awk -F: '{printf ("chmod %s %s\n", $2, $1)}') ; done
只需为D1和D2变量设置正确的值,将它们指向源目录和目标目录,然后运行,目录将具有同步权限。
我刚刚学习了一种新的简单方法来完成此任务:
getfacl -R /path/to/source > /root/perms.acl
这将生成具有所有权限和所有权的列表。
然后转到目标上方的一个级别,并使用
setfacl --restore=/root/perms.acl
您必须处于较高级别的原因是perms.acl中的所有路径都是相对的。
应该以root身份完成。
getfacl
并setfacl
不一定存在于所有系统。
.ac
在第一个命令.acl
中包含第二个命令是否正确?
您可以做的一件事是使用find命令使用复制权限所需的命令来构建脚本。这是一个简单的示例,您可以使用各种printf选项做更多的事情,包括获取所有者,组ID等。
$ find /var/log -type d -printf "chmod %m %p \n" > reset_perms
$ cat reset_perms
chmod 755 /var/log
chmod 755 /var/log/apt
chmod 750 /var/log/apache2
chmod 755 /var/log/fsck
chmod 755 /var/log/gdm
chmod 755 /var/log/cups
chmod 2750 /var/log/exim4
...
两种方式:
(在后一种情况下,/ dst必须存在)
编辑:对不起,我读错了。不是你问的
我想出了这个:
find $SOURCE -mindepth 1 -printf 'chmod --reference=%p\t%p\n'|sed "s/\t$SOURCE/ $DEST/g"|sh
它不是完全防弹的,但是可以满足我的需要。