复制文件权限,但不复制文件。

35
我有两个相同目录结构的副本。它们几乎都包含相同的文件(其中一个版本可能多几个或少几个文件)。然而,这两个目录中大部分文件是共有的(路径和所有内容都相同)。
假设这些目录位于:
version1/
version2/

问题在于版本1/中的权限被弄乱了,我想复制版本2/中的权限,但不替换版本1/中更新的文件。
是否有一种通过bash自动化完成此操作的方法?(它不必是bash,也可以是其他方法/编程语言。)

我在ServerFault上创建了一个与这个主题相关的新问题: 在Unix中复制文件权限,但不是文件 - Mariano Paniga
我认为这是一个很好的问题,其他人也这样认为,因为在问答环节上已经有超过100个赞。如果您不能重新打开此问题,至少将其迁移到Unix&Linux,那里会更受欢迎。我在这里没有足够的声望来提名重新打开,但希望原始发布者可以这样做。 - WinEunuuchs2Unix
3个回答

70

您应该查看chmod--reference选项:

chmod --reference version2/somefile version1/somefile

合理运用findxargs,你应该能够顺利完成,例如:

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

这甚至可以递归地工作,并且对目标目录中缺少的文件具有鲁棒性(除了可以忽略的没有这样的文件... 错误)。当然,它不会对仅存在于目标目录中的文件执行任何操作。
干杯,

1
不和不,分别是“否”和“是”。 - Anders R. Bystrup
1
具体来说,它会将当前目录的权限复制到version1中,我不确定xargs是否会在目标目录中没有匹配文件时继续运行 - 在在生产环境中运行之前,请务必进行测试。 - Anders R. Bystrup
请注意,这不会复制ACL,ACL用于设置比chmod更细粒度的权限。 - mavit
2
请注意,--reference 是 GNU 特有的功能,不是 POSIX 标准,因此 chmod 可能并非所有系统都具备该功能。 - MestreLion
1
我曾通过从Live CD复制权限来拯救一次Fedora安装。现在距离那时已经9个月了,仍然运行良好。谢谢! - danuker
显示剩余4条评论

10
您可以使用此脚本(它会递归地更改权限,但对每个文件/目录单独进行更改)。
#!/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

使用参数 version2 version1 运行脚本


我知道这篇文章已经五年了,但我想知道您是否还记得在发布时测试过它。我想尝试一下,但不想在没有确认之前直接复制、粘贴和运行它,以免出现任何问题。 - WinEunuuchs2Unix

0

你可以尝试:

chmod owner-group-other ./dir or ./file

除非权限是细粒度的,并且在文件之间不同,否则您可以对目录进行递归 chmod 并统一权限。

请参考 man chmod 以获取可能有用的选项的参考资料


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接