在我的Linux机器中有两个目录:
- 具有错误权限的工作文件
- 具有正确权限的同一文件的旧版本(权限和用户和组)
我需要只同步权限而不更改文件内容。我尝试了 rsync,但找不到合适的选项。你能给我一些建议吗?
提前致谢。
编辑
感谢您的建议,我有了这个脚本。它以递归方式更改子树权限:
#!/bin/bash
cd good
find $1/* | while read DIR
do
chown --reference="$DIR" "/bad/$DIR"
chmod --reference="$DIR" "/bad/$DIR"
done
虽然不是杰作,但对我来说还是有用的。
答案1
答案2
你可以试试这个。这个脚本需要 2 个参数的绝对路径。像这样运行 copyperms.sh source_dir target_dir
脚本如下:cat copyperms.sh
#!/bin/bash
srcDir="$1"
targDir="$2"
if [ -z "$srcDir" ] || [ -z "$targDir" ]; then
echo "Required argument missing."
elif [ ! -d "$srcDir" ] || [ ! -d "$targDir" ] ; then
echo "Source and target not both directories."
exit
else
cd $srcDir
echo "Source directory: $srcDir; Target directory: $targDir"
echo "Matching permissions and ownerships .."
find . -print0 | xargs -0I {} echo {} | xargs -I {} chmod --reference "{}" "$targDir/{}"
find . -print0 | xargs -0I {} echo {} | xargs -I {} chown --reference "{}" "$targDir/{}"
# find . | while read name
# do
# chmod --reference "$name" "$targDir/$name"
# chown --reference "$name" "$targDir/$name"
# done
echo ".. done!"
fi
可以通过使用注释掉的 while 循环来适应更多用途,但速度较慢。
$ time mperms /adp/code /adp/safe/code
使用 xargs:
实际 0m0.107s 用户 0m0.008s 系统 0m0.004s
使用 while 循环:
实际 0m0.234s 用户 0m0.012s 系统 0m0.028s 系统 0m0.028s