Unix:有没有办法“复制”文件或目录权限?

Unix:有没有办法“复制”文件或目录权限?

我目录中有两个文件。一个具有正确的权限,另一个则没有。有没有办法将权限集从一个文件“复制”到另一个文件?

答案1

GNU 版本的修改模式公用事业罐复制模式从一个文件(RFile)到另一个文件(file)。

chmod --reference=RFile file

GNU 核心实用程序在大多数 Linux 发行版和 Cygwin 以及其他地方都可以找到。 并非全部修改模式实现提供此选项。

答案2

我想到了这个:

find $SOURCE -mindepth 1 -printf 'chmod --reference=%p\t%p\n'|sed "s/\t$SOURCE/ $DEST/g"|sh

它不是完全防弹的,但是可以满足我的需要。

答案3

尝试这个:

find /PATH/TO/TARGET -exec chmod --reference /PATH/TO/SOURCE/{} {} \;

这将递归地向上并 chmod 每个文件,如果两个目录上的文件不匹配,您将看到很多“没有这样的文件或目录”错误。

答案4

您可以使用它getfacl来检索文件权限、所有者、组和附加 ACL(访问控制列表)的完整列表。

$ getfacl filename.txt
# file: filename.txt
# owner: score
# group: score
user::rw-
group::---
other::---

如果您将该输出保存到文件(例如acl.txt),则可以使用从此格式恢复setfacl --restore acl.txt。如果您只想恢复单个文件,并且该文件的文件名与原始文件不同,则需要使用setfacl --set-file acl.txt filename.txtfilename.txt新文件名在哪里)。

脚步

  1. 保存原始权限至acl.txt

    $ getfacl filename.txt > acl.txt
    
  2. 覆盖权限(用于演示;这只是为了让您看到在下一步中恢复它是否有效)

    $ chmod 777 filename.txt
    $ sudo chown nobody:root filename.txt
    $ ls -l filename.txt
    -rwxrwxrwx 1 nobody root 0 Jan  8 14:24 filename.txt
    
  3. 用于setfacl从以下位置恢复正确的权限acl.txt

    $ sudo setfacl --restore acl.txt
    $ ls -l filename.txt
    -rw------- 1 score score 0 Jan  8 14:24 filename.txt
    

文件名取自# file:生成的注释getfacl,因此无需在命令行中指定它。

如果您想要将这些权限恢复到不同的文件,则可以使用--set-file以下--restore命令:

$ setfacl --set-file acl.txt second_filename.txt

例子

如果您最终覆盖了中某些文件的权限/usr,但不知道覆盖了哪些文件,则通常可以通过从另一个类似配置的系统恢复来修复它。

  1. 从工作系统备份权限(注意:getfacl生成相对路径,因此请确保cd在两台机器上的位置一致)

    # cd /
    # getfacl -R usr > /root/acls.txt
    
  2. 将 ACL 转储复制到权限损坏的系统

    $ scp root@working-system:/root/acls.txt .
    $ scp acls.txt root@broken-system:/root/
    
  3. 恢复 ACL 转储,使用已知正常机器的权限覆盖损坏的权限

    # cd /
    # setfacl --restore /root/acls.txt
    

相关内容