2013-03-06 107 views
33

我有两个相同目录树的副本。他们几乎在两个文件中都有相同的文件(一个版本可能有一些额外的文件或丢失的文件)。但是,大多数文件在两个目录中都是相同的(具有相同的相对路径和所有内容)。复制文件权限,但不复制文件

承担这些都是目录:

version1/ 
version2/ 

的问题是,在VERSION1权限/弄乱了,我想在从版本2 /权限复制,但做到这一点,无需更换文件在版本1 /更新。

是否有自动化的方式通过bash来做到这一点? (它不一定是bash,也可以是其他方法/编程语言)。

+0

我在与此主题相关的ServerFault中创建了一个新问题:[复制文件权限,但不是Unix中的文件](http://serverfault.com/questions/665237/copy-file-permissions-but- not-files-in-unix) – 2015-02-05 12:25:48

回答

66

你应该看看--reference选项chmod

chmod --reference version2/somefile version1/somefile 

以固定方式应用findxargs,你应该罚款,即像

~/version2$ find . -type f | xargs -I {} chmod --reference {} ../version1/{} 

这甚至作品递归地,并且对目标目录中丢失的文件是健壮的(bar 没有这样的文件...错误,这可以被忽略)。当然,它不会对只存在于目标目录中的文件执行任何操作。

欢呼声,

+0

只是为了conf irm,在上面的命令中,它将版本2更改为匹配版本1,而不是相反的正确?最后,这对于缺失文件是强大的? – user788171 2013-03-06 14:44:21

+1

分别为否。 – 2013-03-06 15:01:19

+1

为了详细说明,它将当前目录的权限复制到版本1,并且如果目标目录中没有匹配的文件,我不确定是否会继续执行'xargs' - 您应该在运行FS之前进行测试。 – 2013-03-06 15:41:01

0

chmod owner-group-other ./dir或./file可能吗?

除非权限很好,并且从一个文件到另一个文件不同,您可以对目录执行递归chmod并统一权限。

见人CHMOD的,可能是

7

你可以使用这个脚本(它改变的权限递归,但单独为每个文件/目录)

#!/bin/sh 
chmod --reference $1 $2 
if [ -d $1 ] 
then 
    if [ "x`ls $1`" != "x" ] 
    then 
     for f in `ls $1` 
     do 
      $0 $1/$f $2/$f 
     done 
    fi 
fi 

运行脚本有用的选项引用参数版本2版本1