Linux:同步两个目录的权限、用户和组,并且保持文件内容不变

Linux:同步两个目录的权限、用户和组,并且保持文件内容不变

在我的Linux机器中有两个目录:

  • 具有错误权限的工作文件
  • 具有正确权限的同一文件的旧版本(权限和用户和组)

我需要只同步权限而不更改文件内容。我尝试了 rsync,但找不到合适的选项。你能给我一些建议吗?

提前致谢。

编辑

感谢您的建议,我有了这个脚本。它以递归方式更改子树权限:

#!/bin/bash
cd good
find $1/* | while read DIR
do
 chown --reference="$DIR" "/bad/$DIR"
 chmod --reference="$DIR" "/bad/$DIR"
done

虽然不是杰作,但对我来说还是有用的。

答案1

您可以使用--reference=file开关同时修改模式chown要做到这一点,例如

#!/bin/bash
for FILE  in /path/to/good/directory/*
do
    chown --reference="$FILE" /path/to/bad/directory/"$(basename "$FILE")"
    chmod --reference="$FILE" /path/to/bad/directory/"$(basename "$FILE")"
done

答案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

相关内容